Pytanie Kiedy używać Threadpool w Gevent


Zauważyłem, że Gevent ma obiekt threadpool. Czy ktoś może mi wytłumaczyć, kiedy używać threadpool i kiedy używać puli regularnej? Jaka jest różnica między gevent.threadpool i gevent.pool?


11
2017-08-23 20:19


pochodzenie




Odpowiedzi:


Kiedy masz kawałek kodu Pythona, którego wykonanie zajmuje dużo czasu (sekund) i nie spowoduje to zamiany greenletów. (brak sieci) Wszystkie inne zadania typu greenlet / gevent będą "głodować" i nie będą miały czasu obliczeń, a będzie wyglądać, że aplikacja "zawiesza się".

Jeśli umieścisz to "ciężkie" zadanie w wątku, wykonanie gwintowane sprawi, że inne zielone środowisko nie będzie głodować. Ale wierzę, że jeśli twój kod spędza dużo czasu w bibliotece c, nie będzie to miało żadnego efektu.

poniżej jest przykład z przykłady gevent. Zauważ, że w przykładzie użyto time.sleep, który blokuje, a nie gevent.sleep.

WSKAZÓWKA: Jeśli masz pętlę, która trwa długo, niż możesz włożyć gevent.sleep (0) w pętlę. Każda pętla inne greenlety będą miały szansę uruchomić. The gevent.sleep (0) w twojej powolnej pętli sprawi, że inne greenlety nie będą głodować, a aplikacje będą reagować

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

9
2017-10-03 08:00



"Ale wierzę, że jeśli twój kod spędza dużo czasu w bibliotece c, nie będzie miał żadnego efektu" czy jesteś pewien? Czy odnosisz się do rozszerzeń C lub ctypes? Ponieważ jeśli zwolnisz GIL (ręcznie w rozszerzeniu C lub automatycznie jako ctypes robi) wtedy aplikacja skorzysta z ThreadPool, prawda? - MariusSiuram
tak. "jeśli zwolnisz GIL" dokładnie. Nie mam czasu, aby to wymyślić z każdej biblioteki C ... - Stephan