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
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
"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
sì. "se rilasci il GIL" esattamente. Non ho il tempo di capirlo da ogni C libary ... – Stephan