2013-08-23 3 views
11

Я заметил, что у Gevent есть объект threadpool. Может кто-нибудь объяснить мне, когда использовать threadpool и когда использовать обычный пул? В чем разница между gevent.threadpool и gevent.pool?Когда использовать Threadpool в Gevent

ответ

9

Когда у вас есть кусок кода на Python, который занимает много времени (секунды) и не вызовет поворота зелий. (нет сетей). Все остальные задания greenlets/gevent будут «голодать» и не будут вычислять время, и это будет выглядеть так, как будто приложение «зависает».

Если вы поставили эту «тяжелую» задачу в Threadpool, выполнение в потоке будет гарантировать, что другие зелени не будут голодать. Но я верю, что если ваш код потратит много времени в библиотеке c, он не будет иметь никакого эффекта.

ниже пример от gevent examples. Обратите внимание, что в этом примере используется time.sleep, который блокирует, а не gevent.sleep.

TIP: Если у вас есть цикл, который занимает много времени, чтобы работать, чем вы можете просто положить в gevent.sleep (0) в цикле. У каждого цикла другие зелёные звёзды будут иметь шанс бежать. GEvent .sleep (0) в вашем медленном цикле будет убедиться, что другие greenlets не будут голодать и приложение появляется отзывчивым

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

«Но я верю, что если ваш код тратит много времени в библиотеке переменного тока будет иметь никакого эффекта "вы уверены? Вы имеете в виду расширения C или 'ctypes'? Потому что, если вы отпустите GIL (вручную в расширении C или автоматически, как 'ctypes'), то приложение получит выгоду от ThreadPool, не так ли? – MariusSiuram

+0

есть. «если вы выпустили GIL» точно. У меня нет времени, чтобы понять, что из каждого C libary ... – Stephan

Смежные вопросы