2013-08-23 31 views
11

Tôi đã nhận thấy rằng Gevent có đối tượng threadpool. Ai đó có thể giải thích cho tôi khi sử dụng threadpool và khi nào sử dụng hồ bơi thông thường? Whats sự khác biệt giữa gevent.threadpool và gevent.pool là gì?Khi nào sử dụng Threadpool trong Gevent

Trả lời

9

Khi bạn có một đoạn mã python mất nhiều thời gian để chạy (giây) và sẽ không gây ra swithing của greenlets. (không có mạng) Tất cả các công việc greenlet/gevent khác sẽ 'chết đói' và không có thời gian tính toán và nó sẽ giống như ứng dụng của bạn 'treo'.

Nếu bạn đặt nhiệm vụ 'nặng' này trong một Threadpool, việc thực thi luồng sẽ đảm bảo các greenlet khác sẽ không bị bỏ đói. Nhưng tôi tin rằng nếu mã của bạn dành rất nhiều thời gian trong một thư viện c nó sẽ không có hiệu lực.

dưới đây là ví dụ từ gevent examples. Lưu ý rằng ví dụ này sử dụng time.sleep để chặn và không phải là gevent.sleep.

TIP: Nếu bạn có vòng lặp phải mất nhiều thời gian để chạy hơn bạn có thể đặt gevent.sleep (0) vào vòng lặp. Mỗi vòng lặp greenlets khác sẽ có cơ hội để chạy. Các gevent .sleep (0) trong vòng lặp chậm của bạn sẽ đảm bảo greenlets khác sẽ không chết đói và các ứng dụng xuất hiện đáp ứng

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

"Nhưng tôi tin rằng nếu mã của bạn dành rất nhiều thời gian trong thư viện ac nó sẽ có không có hiệu lực "bạn có chắc chắn không? Bạn đang đề cập đến phần mở rộng C hoặc 'ctypes'? Bởi vì nếu bạn phát hành GIL (thủ công trong một phần mở rộng C hoặc tự động như 'ctypes' hiện) thì ứng dụng sẽ được hưởng lợi từ ThreadPool, phải không? – MariusSiuram

+0

có. "nếu bạn giải phóng GIL" chính xác. Tôi không có thời gian để tìm ra rằng trong mỗi thư viện C ... – Stephan

Các vấn đề liên quan