2012-02-08 4 views
18

私はgeventを使用しています。私はすべて猿のパッチを当てています。
サルのパッチを適用するとスレッドが連続して動作するようです。スレッドを使ってgevent monkeyをパッチすると、スレッドが連続的に処理されます

マイコード:

import threading 
from gevent import monkey; monkey.patch_all() 

class ExampleThread(threading.Thread): 
    def run(self): 
     do_stuff() # takes a few minutes to finish 
     print 'finished working' 

if __name__ == '__main__': 
    worker = ExampleThread() 
    worker.start() 
    print 'this should be printed before the worker finished' 

期待ようにスレッドが動作していません。
しかし、もし私がmonkey.patch_all()を取り除くとうまくいきます。
問題は、私は(今、上記のコードで示す)gevent

マイ溶液を使用するmonkey.patch_all()を必要とすることである:私は

monkey.patch_all(thread=False) 

monkey.patch_all() 

を変更

私はスレッドにパッチを当てていません。

答えて

20

スレッドがgeventで猿のパッチを当てると、スレッドはコルーチンとして動作します。つまり、他のコルーチンを実行できるように明示的に制御を生成する必要があります。

#!/usr/bin/env python 
from gevent import monkey, sleep 
monkey.patch_all() 
import threading 

class ExampleThread(threading.Thread): 
    def run(self): 
     for i in xrange(10): 
      print 'working' 
      sleep() 

if __name__ == '__main__': 
    worker = ExampleThread() 
    worker.start() 
    print 'this will be printed after the first call to sleep' 
+0

私は私の質問を編集した:

これを行う方法は、(これは自動的に生成します)またはgevent.sleepパッチが適用されているブロッキング操作を呼び出すことです。 – yossi

+3

@yossi完了までに時間がかかり、ある時点で制御を出すことができないタスクがある場合は、コルーチンの代わりに実際のスレッドが必要です。そのような場合は、スレッドにパッチを当てない方が良いと言いたいと思います。 – jcollado

+0

ok、私がしたのはmonkey.patch_all(スレッド= False) – yossi

関連する問題