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
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
„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
tak. "jeśli zwolnisz GIL" dokładnie. Nie mam czasu, aby to wymyślić z każdej biblioteki C ... – Stephan