對照着廖雪峰的網站學習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首先運行,在調用剛創建子進程時,創建子進程已經創建好,然后繼續執行后序代碼,當子進程創建好后,顯示子進程。
就是說子進程創建需要時間,在這個空閑時間,父線程繼續執行代碼,子進程創建完成后顯示。