Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Child processes created with python multiprocessing module won't print

I have a problem with the code below, and with any code that uses the print function in the child processes. I can't see any printed statements, even if I use sys.std[err|out].write('worker') instead of print.

This is the code (from the official python documentation):

from multiprocessing import Process  def f(name):     print 'hello', name  if __name__ == '__main__':     p = Process(target=f, args=('bob',))     p.start()     p.join() 

The output is blank.

Note: The following code uses the threading module and it prints the output:

import threading  def f(name):     print 'hello', name  if __name__ == '__main__':     p = threading.Thread(target=f, args=('bob',))     p.start()     p.join() 

Output: hello bob

Can you please point me to the solution? Thanks in advance.

like image 405
John Avatar asked May 05 '10 15:05

John


2 Answers

Try this:

from multiprocessing import Process import sys  def f(name):     print 'hello', name     sys.stdout.flush()  ... 

AFAIK the standard output of processed spawned by the multiprocessing module is buffered, hence you will see the output only if the buffer becomes full or you explicitly flush sys.stdout.

like image 191
Tamás Avatar answered Sep 18 '22 14:09

Tamás


The docs for multiprocessing clearly explain why this won't work!

"Note: Functionality within this package requires that the __main__ method be importable by the children. This is covered in Programming guidelines however it is worth pointing out here. This means that some examples, such as the multiprocessing.Pool examples will not work in the interactive interpreter."

like image 42
manifest Avatar answered Sep 18 '22 14:09

manifest