generators shared among threads

Bryan Olson fakeaddress at nowhere.org
Wed Mar 8 11:41:00 EST 2006


jess.austin at gmail.com wrote:
> Paul wrote:
> 
>>   def f():
>>       lock = threading.Lock()
>>       i = 0
>>       while True:
>>           lock.acquire()
>>           yield i
>>           i += 1
>>           lock.release()
>>
>>but it's easy to make mistakes when implementing things like that
>>(I'm not even totally confident that the above is correct).
> 
> 
> The main problem with this is that the yield leaves the lock locked.
> If any other thread wants to read the generator it will block.

I don't think so. The second thread will start right after the
yeild, and release the lock before acquiring it.

Here's a demo:


import threading
import time

def start_daemon(closure):
       t = threading.Thread(target=closure)
       t.setDaemon(True)
       t.start()

def f():
     lock = threading.Lock()
     i = 0
     while True:
         lock.acquire()
         yield i
         i += 1
         lock.release()


fgen = f()

def count3():
     for _ in range(3):
         print '---', fgen.next()
     time.sleep(10)

start_daemon(count3)
time.sleep(1.0)
print "+++", fgen.next()


-- 
--Bryan



More information about the Python-list mailing list