문제

I've noticed that Gevent has threadpool object. Can someone explain to me when to use threadpool and when to use regular pool? Whats the difference between gevent.threadpool and gevent.pool?

도움이 되었습니까?

해결책

When you have a piece of python code that takes a long time to run (for seconds) and does not cause switching of greenlets, all other greenlets / gevent jobs will 'starve' and have no computation time and it will look like your application 'hangs'.

If you put this 'heavy' task in a Threadpool, the threaded execution will make sure other greenlets will not starve. But I believe if your code spends a lot of time in a C library, it will have no effect.

Below is an example from gevent. Note that the example uses time.sleep which blocks, instead of gevent.sleep.

TIP: If you have a loop that takes a long time to run, then you can just put in a gevent.sleep(0) in the loop. Every loop other greenlets will have a chance to run. The gevent.sleep(0) in your slow loop will make sure other greenlets will not starve and the application appears responsive

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top