Я заметил, что у Gevent есть объект threadpool. Может ли кто-нибудь объяснить мне, когда использовать пул потоков и когда использовать обычный пул? В чем разница между gevent.threadpool и gevent.pool?
Когда использовать Threadpool в Gevent
Ответы:
Когда у вас есть фрагмент кода Python, который выполняется долго (в течение нескольких секунд) и не вызывает переключения гринлетов, все другие задания гринлетов/гевентов будут «голодать» и не будут иметь времени вычислений, и это будет выглядеть как ваше приложение. висит».
Если вы поместите эту «тяжелую» задачу в пул потоков, многопоточное выполнение гарантирует, что другие гринлеты не будут голодать. Но я считаю, что если ваш код проводит много времени в библиотеке C, это не будет иметь никакого эффекта.
Ниже приведен пример из gevent. Обратите внимание, что в примере используется блокировка time.sleep
вместо gevent.sleep
.
СОВЕТ. Если у вас есть цикл, выполнение которого занимает много времени, вы можете просто добавить в цикл gevent.sleep(0). В каждом цикле у других зеленых будет шанс побежать. gevent.sleep(0) в медленном цикле гарантирует, что другие гринлеты не будут голодать, а приложение будет реагировать на запросы.
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
ctypes
? Потому что, если вы выпустите GIL (вручную в расширении C или автоматически, как это делаетctypes
), то приложение выиграет от ThreadPool, не так ли? 21.01.2015