理解Python multiprocessing.Process start和join方法

以下代碼來自:https://www.cnblogs.com/lipijin/p/3709903.html,這裏只是將其中print轉爲python3方式,通過依次看這幾段代碼以及運行結果應該能夠理解start和join方法,文字描述反而可能會造成誤解。

In [1]: #encoding:utf-8 
   ...: from multiprocessing import Process 
   ...: import os, time, random 
   ...:  
   ...: #線程啓動後實際執行的代碼塊 
   ...: def r1(process_name): 
   ...:     for i in range(5): 
   ...:         print(process_name, os.getpid())     #打印出當前進程的id 
   ...:         time.sleep(random.random()) 
   ...:  
   ...: def r2(process_name): 
   ...:     for i in range(5): 
   ...:         print(process_name, os.getpid())     #打印出當前進程的id 
   ...:         time.sleep(random.random()) 
   ...:      
   ...: if __name__ == "__main__": 
   ...:         print("main process run...") 
   ...:         p1 = Process(target=r1, args=('process_name1', ))       #target:指定進程執行的函數,args:該函數的參數,需要使用tuple 
   ...:         p2 = Process(target=r2, args=('process_name2', )) 
   ...:          
   ...:         p1.start()    #通過調用start方法啓動進程,跟線程差不多。 
   ...:         p2.start()    #但run方法在哪呢?待會說。。。 
   ...:         p1.join()     #join方法也很有意思,尋思了一下午,終於理解了。待會演示。 
   ...:         p2.join() 
   ...:         print("main process runned all lines...") 
   ...:                                                                                                                                                                                                            
main process run...
process_name1 7713
process_name2 7714
process_name1 7713
process_name2 7714
process_name2 7714
process_name1 7713
process_name1 7713
process_name2 7714
process_name1 7713
process_name2 7714
main process runned all lines...
In [1]: #encoding:utf-8 
   ...: from multiprocessing import Process 
   ...: import os, time, random 
   ...:  
   ...: def r(): 
   ...:     print('run method') 
   ...:      
   ...: if __name__ == "__main__": 
   ...:         print("main process run...") 
   ...:         #沒有指定Process的targt 
   ...:         p1 = Process() 
   ...:         p2 = Process() 
   ...:         #如果在創建Process時不指定target,那麼執行時沒有任何效果。因爲默認的run方法是判斷如果不指定target,那就什麼都不做 
   ...:         #所以這裏手動改變了run方法 
   ...:         p1.run = r 
   ...:         p2.run = r 
   ...:          
   ...:         p1.start() 
   ...:         p2.start() 
   ...:         p1.join() 
   ...:         p2.join() 
   ...:         print("main process runned all lines...") 
   ...:                                                                                                                                                                                                            
main process run...
run method
run method
main process runned all lines...
In [1]: #encoding:utf-8 
   ...: from multiprocessing import Process 
   ...: import os, time, random 
   ...:  
   ...: def r1(process_name): 
   ...:     for i in range(5): 
   ...:         print(process_name, os.getpid())     #打印出當前進程的id 
   ...:         time.sleep(random.random()) 
   ...: def r2(process_name): 
   ...:     for i in range(5): 
   ...:         print(process_name, os.getpid())     #打印出當前進程的id 
   ...:         time.sleep(random.random()) 
   ...:  
   ...: if __name__ == "__main__": 
   ...:         print("main process run...") 
   ...:         p1 = Process(target=r1, args=('process_name1', ))  
   ...:         p2 = Process(target=r2, args=('process_name2', ))  
   ...:  
   ...:         p1.start() 
   ...:         p2.start() 
   ...:         #p1.join() 
   ...:         #p2.join()     
   ...:         print("main process runned all lines...") 
   ...:                                                                                                                                                                                                            
main process run...
process_name1 7881
main process runned all lines...
process_name2 7882
process_name2 7882                                                                                                                                                                                         
process_name2 7882
process_name2 7882
process_name2 7882
process_name1 7881
process_name1 7881
process_name1 7881
process_name1 7881
In [1]: #encoding:utf-8 
   ...: from multiprocessing import Process 
   ...: import os, time, random 
   ...:  
   ...: def r1(process_name): 
   ...:     for i in range(5): 
   ...:         print(process_name, os.getpid())     #打印出當前進程的id 
   ...:         time.sleep(random.random()) 
   ...: def r2(process_name): 
   ...:     for i in range(5): 
   ...:         print(process_name, os.getpid())     #打印出當前進程的id 
   ...:         time.sleep(random.random()*2) 
   ...:  
   ...: if __name__ == "__main__": 
   ...:         print("main process run...") 
   ...:         p1 = Process(target=r1, args=('process_name1', ))  
   ...:         p2 = Process(target=r2, args=('process_name2', ))  
   ...:  
   ...:         p1.start() 
   ...:         p2.start() 
   ...:         p1.join() 
   ...:         #p2.join()     
   ...:         print("main process runned all lines...") 
   ...:                                                                                                                                                                                                            
main process run...
process_name1 7938
process_name2 7939
process_name1 7938
process_name1 7938
process_name1 7938
process_name2 7939
process_name1 7938
process_name2 7939
main process runned all lines...

process_name2 7939                                                                                                                                                                                         
process_name2 7939
In [1]: #encoding:utf-8 
   ...: from multiprocessing import Process 
   ...: import os, time, random 
   ...:  
   ...: def r1(process_name): 
   ...:     for i in range(5): 
   ...:         print(process_name, os.getpid())     #打印出當前進程的id 
   ...:         time.sleep(random.random()) 
   ...: def r2(process_name): 
   ...:     for i in range(5): 
   ...:         print(process_name, os.getpid())     #打印出當前進程的id 
   ...:         time.sleep(random.random()*2) 
   ...:  
   ...: if __name__ == "__main__": 
   ...:         print("main process run...") 
   ...:         p1 = Process(target=r1, args=('process_name1', ))  
   ...:         p2 = Process(target=r2, args=('process_name2', ))  
   ...:  
   ...:         p1.start() 
   ...:         p1.join() 
   ...:         p2.start() 
   ...:         #p2.join()     
   ...:         print("main process runned all lines...") 
   ...:                                                                                                                                                                                                            
main process run...
process_name1 7993
process_name1 7993
process_name1 7993
process_name1 7993
process_name1 7993
main process runned all lines...

process_name2 7994
process_name2 7994                                                                                                                                                                                        
process_name2 7994
process_name2 7994
process_name2 7994
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章