2013-08-23 11 views
11

Ho notato che Gevent ha un oggetto threadpool. Qualcuno può spiegarmi quando utilizzare threadpool e quando utilizzare il pool regolare? Qual è la differenza tra gevent.threadpool e gevent.pool?Quando utilizzare Threadpool in Gevent

risposta

9

Quando si dispone di un pezzo di codice Python che richiede molto tempo per essere eseguito (secondi) e non causa lo swithing dei greenlet. (nessun collegamento in rete) Tutti gli altri lavori greenlet/gevent si "affamano" e non hanno tempo di calcolo e sembrerà che l'applicazione "si blocca".

Se si inserisce questa attività "pesante" in un Threadpool, l'esecuzione del thread assicurerà che altri greenlet non moriranno di fame. Ma credo che se il tuo codice trascorre molto tempo in una libreria c non avrà alcun effetto.

di seguito è un esempio da gevent examples. Nota che l'esempio usa time.sleep che blocca e non gevent.sleep.

TIP: Se si dispone di un ciclo che richiede molto tempo per l'esecuzione di quanto si può semplicemente mettere in un gevent.sleep (0) nel ciclo. Ogni ciclo altri greenlet avranno la possibilità di correre. Il gevent .sleep (0) nel ciclo lento farà che gli altri greenlets non moriranno di fame e le applicazioni appare reattivo

import time 
import gevent 
from gevent.threadpool import ThreadPool 


pool = ThreadPool(3) 
start = time.time() 
for _ in xrange(4): 
    pool.spawn(time.sleep, 1) 
gevent.wait() 
delay = time.time() - start 
print 'Running "time.sleep(1)" 4 times with 3 threads. Should take about 2 seconds: %.3fs' % delay 
+0

"Ma credo che se il codice spende un sacco di tempo in libreria ac avrà nessun effetto "sei sicuro? Ti riferisci alle estensioni C o ai 'ctype'? Perché se si rilascia GIL (manualmente in un'estensione C o automaticamente come 'ctypes'), l'applicazione trarrà vantaggio dal ThreadPool, no? – MariusSiuram

+0

sì. "se rilasci il GIL" esattamente. Non ho il tempo di capirlo da ogni C libary ... – Stephan