If I do a time.sleep(0.001) right at the beginning of the run() method, then it completes fine. I was able to run it through a couple hundred times without problem. If I sleep for less time than that or not at all, it may or may not complete.
On Mon, Feb 27, 2012 at 9:38 PM, MRAB <pyt...@mrabarnett.plus.com> wrote: > On 27/02/2012 16:57, Eric Frederich wrote: > >> Still freezing sometimes, like 1 out of 10 times that I run it. >> Here is updated code and a couple of outputs. >> >> [snip] > I don't know what the problem is. All I can suggest is a slightly > modified version. > > If a worker that says it's terminating without first saying that it's > got nothing, then I can only assume that the worker had some uncaught > exception. > > > > #!/usr/bin/env python > > import sys > import Queue > import multiprocessing > import time > > def FOO(a, b, c): > print 'foo', a, b, c > return (a + b) * c > > class MyWorker(multiprocessing.**Process): > def __init__(self, name, inbox, outbox): > super(MyWorker, self).__init__() > self.name = name > self.inbox = inbox > self.outbox = outbox > print >> sys.stderr, 'Created %s' % self.name; sys.stderr.flush() > def run(self): > print >> sys.stderr, 'Running %s' % self.name; sys.stderr.flush() > try: > > while True: > try: > args = self.inbox.get_nowait() > print >> sys.stderr, '%s got something to do' % > self.name; sys.stderr.flush() > except Queue.Empty: > print >> sys.stderr, '%s got nothing' % self.name; > sys.stderr.flush() > break > self.outbox.put(FOO(*args)) > finally: > print >> sys.stderr, '%s is terminating' % self.name; > sys.stderr.flush() > > > if __name__ == '__main__': > # This file is being run as the main script. This part won't be > # run if the file is imported. > > print >> sys.stderr, 'Creating todo queue'; sys.stderr.flush() > todo = multiprocessing.Queue() > > for i in xrange(100): > todo.put((i, i + 1, i + 2)) > > print >> sys.stderr, 'Creating results queue'; sys.stderr.flush() > result_queue = multiprocessing.Queue() > > print >> sys.stderr, 'Creating Workers'; sys.stderr.flush() > w1 = MyWorker('Worker 1', todo, result_queue) > w2 = MyWorker('Worker 2', todo, result_queue) > > print >> sys.stderr, 'Starting Worker 1'; sys.stderr.flush() > w1.start() > print >> sys.stderr, 'Starting Worker 2'; sys.stderr.flush() > w2.start() > > for i in xrange(100): > print result_queue.get() > -- > http://mail.python.org/**mailman/listinfo/python-list<http://mail.python.org/mailman/listinfo/python-list> >
-- http://mail.python.org/mailman/listinfo/python-list