Each Answer to this Q is separated by one/two green lines.
I have a problem with the code below, and with any code that uses the
sys.std[err|out].write('worker') instead of
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()
Can you please point me to the solution? Thanks in advance.
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
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.”
Having run into this issue myself, sometimes this can be because the child process is actually silently failing before ever getting to the print statement. If this is the case, wrapping the child process code in a try-except block and returning the exception object (to be printed in the parent process) is an effective way to debug this.