python 多進程的啟動和代碼執行順序


對照着廖雪峰的網站學習Python遇到些問題:

在進程中,父進程創建子進程時發現,顯示不是按照順序顯示,疑問?

參照代碼如下:  

 1 from multiprocessing import Pool
 2 import os, time, random
 3 
 4 def long_time_task(name):
 5     print 'Run task %s (%s)...' % (name, os.getpid())
 6     start = time.time()
 7     time.sleep(random.random() * 3)
 8     end = time.time()
 9     print 'Task %s runs %0.2f seconds.' % (name, (end - start))
10 
11 if __name__=='__main__':
12     print 'Parent process %s.' % os.getpid()
13     p = Pool()
14     for i in range(5):
15         p.apply_async(long_time_task, args=(i,))
16     print 'Waiting for all subprocesses done...'
17     p.close()
18     p.join()
19     print 'All subprocesses done.'

運行結果:

  可以看出代碼執行是從if __name__=='__main__'開始執行,在執行15行調用long_time_task后,沒有打印'Run task %s (%s)...'

  但是在15行p.apply_async(long_time_task, args=(i,)),加入 print ‘??’,會在'Waiting for all subprocesses done...',之前,打印‘’??‘’對這個很疑惑。

修改代碼,讓每個打印時,打印出時間:

 1 from multiprocessing import Pool
 2 import os, time, random
 3 
 4 def long_time_task(name):
 5     print 'Run task %s (%s) at %f...' % (name, os.getpid(),time.time())
 6     start = time.time()
 7     time.sleep(random.random() * 3)
 8     end = time.time()
 9     print 'Task %s runs %0.2f seconds.' % (name, (end - start))
10 
11 if __name__=='__main__':
12     print 'Parent process %s.' % os.getpid()
13     p = Pool()
14     for i in range(5):
15         p.apply_async(long_time_task, args=(i,))
16         print 'time:%s:' %time.time()    
17     print 'parent: %f' %time.time()
18     print 'Waiting for all subprocesses done...'
19     p.close()
20     p.join()
21     print 'All subprocesses done.'
22     

運行結果:

這樣就找到原因了:

  ps:在新代碼中將原來的代碼中long_time_task()創建子進程中的sleep刪去。

  parent首先運行,在調用剛創建子進程時,創建子進程已經創建好,然后繼續執行后序代碼,當子進程創建好后,顯示子進程。

  就是說子進程創建需要時間在這個空閑時間,父線程繼續執行代碼,子進程創建完成后顯示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM