2013-08-23 25 views
11

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

Odpowiedz

9

Kiedy masz kawałek kodu Pythona, którego wykonanie zajmuje dużo czasu (kilka sekund) i nie spowoduje to zamiany zielonych obiektó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 gwintu sprawi, że inne zielone środowisko nie będzie głodzone. 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 to przykład z gevent examples. Zauważ, że w przykładzie użyto time.sleep, który blokuje, a nie gevent.sleep.

TIP: Jeśli masz pętlę, która zajmuje dużo czasu, aby uruchomić niż można po prostu umieścić w gevent.sleep (0) w pętli. Każda pętla inne greenlety będą miały szansę uruchomić. gevent .sleep (0) w swoim powolnym pętli zadba inne greenlets nie będą głodować i aplikacje pojawia reaguje

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 
+0

„Ale wierzę, jeśli kod spędza dużo czasu w bibliotece ac będzie miał brak efektu "jesteś pewien? Czy odnosisz się do rozszerzeń C lub "ctypes"? Ponieważ jeśli zwolnisz GIL (ręcznie w rozszerzeniu C lub automatycznie jako 'ctypes'), to aplikacja skorzysta z ThreadPool, prawda? – MariusSiuram

+0

tak. "jeśli zwolnisz GIL" dokładnie. Nie mam czasu, aby to wymyślić z każdej biblioteki C ... – Stephan

Powiązane problemy