使用请求和多处理时出现奇怪的问题

请检查这个Python代码:

#!/usr/bin/env python import requests import multiprocessing from time import sleep, time from requests import async def do_req(): r = requests.get("http://w3c.org/") def do_sth(): while True: sleep(10) if __name__ == '__main__': do_req() multiprocessing.Process( target=do_sth, args=() ).start() 

当我按Ctrl-C(运行后等待2秒 – 让进程运行),它不停止。 当我将import订单更改为:

 from requests import async from time import sleep, time 

它在Ctrl-C之后停止。 为什么它不停止/杀死第一个例子?

这是一个错误或function?

笔记:

  • 是的,我知道,我没有在这个代码中使用asynchronous,这只是简单的代码。 在真实的代码中,我使用它。 我这样做是为了简化我的问题。
  • 按下Ctrl-C后,有一个新的(子)进程正在运行。 为什么?
  • multiprocessing.__version__ == 0.70a1requests.__version__ == 0.11.2gevent.__version__ == 0.13.7

请求异步模块使用gevent。 如果你看一下gevent的源代码,你会发现它修补了许多Python的标准库函数,包括sleep:

导入过程中的request.async模块执行:

  from gevent import monkey as curious_george # Monkey-patch. curious_george.patch_all(thread=False, select=False) 

看看gevent的monkey.py模块,你可以看到:

https://bitbucket.org/denis/gevent/src/f838056c793d/gevent/monkey.py#cl-128

 def patch_time(): """Replace :func:`time.sleep` with :func:`gevent.sleep`.""" from gevent.hub import sleep import time patch_item(time, 'sleep', sleep) 

查看来自gevent仓库的代码以获取详细信息。