Python 2.6's multiprocessing lock not working on second use?

Jesse Noller jnoller at gmail.com
Mon Jan 19 09:00:49 EST 2009


On Mon, Jan 19, 2009 at 8:16 AM, Frédéric Sagnes <speedup at gmail.com> wrote:
> On Jan 19, 11:53 am, Frédéric Sagnes <spee... at gmail.com> wrote:
>> 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()
>
> Opened issue #4999 [http://bugs.python.org/issue4999] on the matter,
> referencing this thread.
>

Thanks, I've assigned it to myself. Hopefully I can get a fix put
together soonish, time permitting.
-jesse



More information about the Python-list mailing list