Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When to use Threadpool in Gevent

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?

like image 203
Goranek Avatar asked Aug 23 '13 20:08

Goranek


1 Answers

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
like image 198
Stephan Avatar answered Oct 17 '22 09:10

Stephan