Edited để thêm điểm chuẩn dưới đây.
Bạn có thể quấn máy phát điện có khóa. Ví dụ,
import threading
class LockedIterator(object):
def __init__(self, it):
self.lock = threading.Lock()
self.it = it.__iter__()
def __iter__(self): return self
def next(self):
self.lock.acquire()
try:
return self.it.next()
finally:
self.lock.release()
gen = [x*2 for x in [1,2,3,4]]
g2 = LockedIterator(gen)
print list(g2)
Khóa mất 50ms trên hệ thống của tôi, Queue mất 350ms. Hàng đợi rất hữu ích khi bạn thực sự có hàng đợi; ví dụ, nếu bạn có các yêu cầu HTTP đến và bạn muốn xếp hàng chúng để xử lý bởi các luồng công nhân. (Điều đó không phù hợp với mô hình trình lặp Python - một khi một trình vòng lặp chạy hết các mục, nó được thực hiện.) Nếu bạn thực sự có một trình lặp, thì Trình thay đổi khóa (LockIterator) là một cách nhanh hơn và đơn giản hơn để làm cho nó an toàn.
from datetime import datetime
import threading
num_worker_threads = 4
class LockedIterator(object):
def __init__(self, it):
self.lock = threading.Lock()
self.it = it.__iter__()
def __iter__(self): return self
def next(self):
self.lock.acquire()
try:
return self.it.next()
finally:
self.lock.release()
def test_locked(it):
it = LockedIterator(it)
def worker():
try:
for i in it:
pass
except Exception, e:
print e
raise
threads = []
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threads:
t.join()
def test_queue(it):
from Queue import Queue
def worker():
try:
while True:
item = q.get()
q.task_done()
except Exception, e:
print e
raise
q = Queue()
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
t.setDaemon(True)
t.start()
t1 = datetime.now()
for item in it:
q.put(item)
q.join()
start_time = datetime.now()
it = [x*2 for x in range(1,10000)]
test_locked(it)
#test_queue(it)
end_time = datetime.now()
took = end_time-start_time
print "took %.01f" % ((took.seconds + took.microseconds/1000000.0)*1000)
Nguồn
2009-07-15 19:55:32
Chắc chắn +1 cho hàng đợi.Queue, cách tuyệt vời để tổ chức hệ thống luồng khi có thể (hầu hết thời gian và chắc chắn cho tác vụ này). –