python3.x multiprocessing cycling without "if __name__ == '__main__':"
multiprocessing, python, python-3.x
Solution
This is an issue with `multiprocessing` on MS Windows: the main module is imported by the child tasks, so any code not protected by the `if __name__ . . .` clause gets run again, resulting in an infinite loop.
Problem
I have this file (it doesn't make any useful work, it's only for learning): ``` import multiprocessing,sys def parent(numproc=2): print ('at start') childs=[] print ('bfore Pipe') (parentEnd,childEnd)=multiprocessing.Pipe() i=0 print ('printing i:',i) child=multiprocessing.Process(target=child_proc, args=(childEnd,i)) print ('created child') child.start() print ('started child') print ('joining child') child.join() print ('joined child') print ('exeted from for i in childs') mins=[1,2] print ('task ended. result: ',min(mins)) def child_proc(pipe,name): pass if __name__ == '__main__': parent() ``` in this form it runs perfectly: ``` at start bfore Pipe printing i: 0 created child started child joining child joined child exeted from for i in childs task ended. result: 1 ``` but if I put in end of file instead of ``` if __name__ == '__main__': parent() ``` only ``` parent() ``` it falls in cycle... ``` at start bfore Pipe printing i: 0 created child started child joining child at start bfore Pipe printing i: 0 created child started child joining child at start bfore Pipe printing i: 0 created child started child joining child Traceback (most recent call last): ``` Why?! What different makes this if clause?