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