4

请检查这个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 秒 - 让进程运行)时,它不会停止。当我将导入顺序更改为:

from requests import async
from time import sleep, time

它在 Ctrl-C 之后停止。为什么它在第一个示例中没有停止/杀死?

这是一个错误还是一个功能?

笔记:

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

1 回答 1

6

请求异步模块使用 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 存储库中的代码以获取详细信息。

于 2012-05-04T10:29:41.543 回答