2012-05-03 9 views
4

マルチプロセッシング時に、このPythonコードを確認してください:私はCtrlキーを押しながらCを(実行後に2秒を待って - みましょうプロセスの実行)を押すと奇妙な問題の要求を使用して

#!/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() 

、それは停止しません。輸入注文を変更すると:

from requests import async 
from time import sleep, time 

これはCtrl-Cの後に停止します。なぜそれが最初の例で停止/殺していないのですか?

これはバグですか、機能ですか?

注:

  • はい、私はこれは単にコードをストリップダウンされ、このコードで非同期を使用していないことを、知っています。実際のコードで私はそれを使用します。私は私の質問を簡素化するためにそれをしました。
  • Ctrl-Cを押すと、新しい(子プロセス)プロセスが実行されます。どうして?
  • multiprocessing.__version__ == 0.70a1requests.__version__ == 0.11.2gevent.__version__ == 0.13.7
+0

多分、あなたはいくつかのモジュールまたは関数名(time?)を上書きするでしょう。 "from .. import .."の使用をやめ、 "time.time()"のような完全修飾名を使用してください。これはあなた自身の問題を解決するかもしれません( – snies

答えて

6

要求非同期モジュールはgeventを使用しています。インポート時

request.asyncモジュール実行:あなたはgeventのソースコードを見れば、あなたはそれが睡眠など、Pythonの標準ライブラリ関数、多くのmonkey patchesていることがわかります

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

がmonkey.pyを見ますあなたが見ることができるgeventのモジュール:

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のrepositoからのコードを見てみましょう詳細はryを参照してください。

+0

)。そして、@neutrinusのインポートは、ケース1で非同期をインポートする前に眠るので、time.sleepの代わりにsleepを使用しているところでパッチを逃してしまいます。 – snies

+0

詳細な説明をありがとう。 geventのパッチ適用の問題のように見えますが、私はgeventバージョン1.0にアップグレードしました。これは動作しました(彼らはlibeventの代わりにlibevに移動しました)。このバージョンはpypi btwにあるはずです... – neutrinus