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