multiprocessing not quite working

MRAB python at mrabarnett.plus.com
Tue May 24 19:39:38 EDT 2016


On 2016-05-24 23:17, Noah wrote:
>
> Hi,
>
> I am using this example:
> http://spartanideas.msu.edu/2014/06/20/an-introduction-to-parallel-programming-using-pythons-multiprocessing-module/
>
> I am sending and receiving communication from the worker processes.
>
> Two issues. the join is only getting to the process and waiting.
> When I comment out the .join() process the output.get() appends the
> previous process and therefore the returned output keeps getting longer
> and longer after each process returns its output.
>
> hostnames is an array of hostnames.
>
> here is my code from main():
>
>      # Define an output queue
>      output = mp.Queue()
>
>      # Setup a list of processes that we want to run
>      processes = [mp.Process(target=worker, args=(hostnames[x], output))
> for x in range(len(hostnames))]
>
>      # Run processes
>      for p in processes:
>          print "start: {}".format(p)
>          p.start()
>
>      time.sleep(6)
>      print "processes: {}".format(processes)
>
>      # Exit the completed processes
>      '''for p in processes:
>          print "join: {}".format(p)
>          p.join()'''
>
>      print "got here"
>      # Get process results from the output queue
>      # results = [output.get() for p in processes]
>
>      io = StringIO()
>      count = 0
>      for p in processes:
>          found_output = output.get()
>          print "returned {}".format(p)
>          io.write (found_output)
>          zipArchive.writestr(hostnames[count] + "." +
> content['sitename'] + '.config.txt', io.getvalue())
>          count = count + 1
>      io.close()
>
>
> def worker(hostname, output):
> .
> .
> .
>          output.put(template_output)
>
>
It says in the docs (Python 2.7, 16.6.2.2. Pipes and Queues):

"""Warning
As mentioned above, if a child process has put items on a queue (and it 
has not used JoinableQueue.cancel_join_thread), then that process will 
not terminate until all buffered items have been flushed to the pipe.

This means that *if you try joining that process you may get a deadlock 
unless you are sure that all items which have been put on the queue have 
been consumed*. Similarly, if the child process is non-daemonic then the 
parent process may hang on exit when it tries to join all its 
non-daemonic children.

Note that a queue created using a manager does not have this issue. See 
Programming guidelines.
"""

(Asterisks added to highlight.)

You should try to consume the output from a process before trying to 
join it (or, at least, join it without a timeout).




More information about the Python-list mailing list