2012-02-08 7 views
18

Sto usando gevent e sono scimmia patch tutto.
Sembra che il patching della scimmia faccia sì che la filettatura funzioni in serie.Utilizzando scimmia gevent patching con filettatura rende il lavoro filo serialmente

Il mio codice:

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' 

modo che il filo non funziona come previsto.
Ma se rimuovo lo monkey.patch_all() funziona correttamente.
Il problema è che ho bisogno del monkey.patch_all() per l'utilizzo di gevent (ora dimostrato nel codice qui sopra)

La mia soluzione:

ho cambiato il

monkey.patch_all() 

a

monkey.patch_all(thread=False) 

quindi non sto rattoppando il thread.

risposta

20

Quando i thread sono rattoppati in gevent, si comportano come coroutine. Ciò significa che devi fornire un controllo esplicito per rendere possibile l'esecuzione di altre coroutine.

Il modo per farlo è chiamare un'operazione di blocco che è stato patchato (questo produrrà automaticamente) o 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

Ho modificato la mia domanda. Non posso usare il sonno perché il mio lavoro richiede alcuni minuti, – yossi

+3

@yossi Se hai un'attività che richiede molto tempo per essere completata e non è possibile ottenere il controllo ad un certo punto, allora hai bisogno di thread reali invece di coroutine. In tal caso, direi che è meglio non applicare patch ai thread. – jcollado

+0

ok, quello che ho fatto è monkey.patch_all (thread = False) – yossi