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のソースコードを見ると、sleepを含むPythonの標準ライブラリ関数の多くにモンキーパッチが適用されていることがわかります。

インポート実行中の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 に答える