Python 2.6's multiprocessing lock not working on second use?
Frédéric Sagnes
speedup at gmail.com
Mon Jan 19 05:53:57 EST 2009
On Jan 17, 11:32 am, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Fri, 16 Jan 2009 14:41:21 -0200, escribiste en el grupo
> gmane.comp.python.general
>
> > I ran a few tests on the new Python 2.6multiprocessingmodule before
> > migrating a threading code, and found out the locking code is not
> > working well. In this case, a pool of 5 processes is running, each
> > trying to get the lock and releasing it after waiting 0.2 seconds
> > (action is repeated twice). It looks like themultiprocessinglock
> > allows multiple locking after the second pass. Running the exact same
> > code with threads works correctly.
>
> I've tested your code on Windows and I think the problem is on the Queue
> class. If you replace the Queue with some print statements or write to a
> log file, the sequence lock/release is OK.
> You should file a bug report onhttp://bugs.python.org/
>
> --
> Gabriel Genellina
Thanks for your help gabriel, I just tested it without the queue and
it works! I'll file a bug about the queues.
Fred
For those interested, the code that works (well, it always did, but
this shows the real result):
class test_lock_process(object):
def __init__(self, lock):
self.lock = lock
self.read_lock()
def read_lock(self):
for i in xrange(5):
self.lock.acquire()
logging.info('Got lock')
time.sleep(.2)
logging.info('Released lock')
self.lock.release()
if __name__ == "__main__":
logging.basicConfig(format='[%(process)04d@%(relativeCreated)04d] %
(message)s', level=logging.DEBUG)
lock = Lock()
processes = []
for i in xrange(2):
processes.append(Process(target=test_lock_process, args=
(lock,)))
for t in processes:
t.start()
for t in processes:
t.join()
More information about the Python-list
mailing list