2012-02-08 8 views
18

Używam gevent i jestem małpką łatającą wszystko.
Wygląda na to, że łatanie małpy powoduje, że wątki działają seryjnie.Używanie łatek z gwintowaniem geent z gwintowaniem sprawia, że ​​wątek działa seryjnie

Mój kod:

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' 

Więc nić nie działa zgodnie z oczekiwaniami.
Ale jeśli usunę monkey.patch_all(), to działa dobrze.
Problemem jest to, że muszę monkey.patch_all() za korzystanie gevent (teraz pokazane w powyższym kodzie)

Moje rozwiązanie:

Zmieniłem

monkey.patch_all() 

do

monkey.patch_all(thread=False) 

więc nie łatam wątku.

Odpowiedz

20

Kiedy nici są załatane małpą w gevent, zachowują się jak coroutines. Oznacza to, że musisz wyraźnie uzyskać kontrolę, aby możliwe było wykonanie innych współprogramów.

Sposobem na to jest wywołać działanie blokujące który został połatany (będzie to wydajność automatycznie) lub gevent.sleep:

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

mam edytowany moje pytanie. Nie mogę spać, ponieważ moja praca zajmuje kilka minut, – yossi

+3

@yossi Jeśli masz zadanie, które zajmuje dużo czasu i nie można uzyskać kontroli w pewnym momencie, potrzebujesz prawdziwych wątków zamiast coroutines. W takim przypadku powiedziałbym, że lepiej nie łatać wątków. – jcollado

+0

ok, co zrobiłem, to monkey.patch_all (thread = False) – yossi