संपादित नीचे बेंचमार्क जोड़ने के लिए।
आप एक जेनरेटर को लॉक से लपेट सकते हैं। उदाहरण के लिए,
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)
लॉकिंग अपने सिस्टम पर 50ms लेता है, कतार 350ms लेता है। जब आप वास्तव में एक कतार है तो कतार उपयोगी होती है; उदाहरण के लिए, यदि आपके पास आने वाले HTTP अनुरोध हैं और आप उन्हें वर्कर थ्रेड द्वारा प्रोसेसिंग के लिए कतार देना चाहते हैं। (यह पाइथन इटेटर मॉडल में फिट नहीं होता है - एक बार इटेटरेटर आइटम से बाहर हो जाता है, यह हो जाता है।) यदि आपके पास वास्तव में एक इटरेटर है, तो लॉकइटरेटर इसे थ्रेड सुरक्षित बनाने का एक तेज़ और आसान तरीका है।
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)
स्रोत
2009-07-15 19:55:32
निश्चित रूप से Queue.Queue के लिए +1, लागू होने पर थ्रेडिंग सिस्टम को व्यवस्थित करने का शानदार तरीका (जो अधिकतर समय है, और निश्चित रूप से इस कार्य के लिए)। –