1 from multiprocessing import Pool 2 import os, time, random 3 4 5 def worker(msg): 6 t_start = time.time() # 獲取開始時間 7 print("%s開始執行,進程號為%d" % (msg, os.getpid())) 8 # random.random()隨機生成0~1之間的浮點數 9 time.sleep(random.random()*2) 10 t_stop = time.time() # 獲取執行結束時間 11 print(msg, "執行完畢,耗時%.2f" % (t_stop-t_start)) 12 13 14 po = Pool(3) # 定義一個進程池,最大進程數是3 15 for i in range(0, 10): 16 po.apply_async(worker, (i,)) 17 18 print("___start___") 19 po.close() 20 po.join() 21 print("___end___")
運行如上代碼時會報以下錯誤信息:
RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable.
從錯誤信息可以看出進程池相關代碼應該放在if __name__ == '__main__'下面,那么可以將進程池運行相關代碼放在main函數下面,代碼修改如下:
1 from multiprocessing import Pool 2 import os, time, random 3 4 5 def worker(msg): 6 t_start = time.time() # 獲取開始時間 7 print("%s開始執行,進程號為%d" % (msg, os.getpid())) 8 # random.random()隨機生成0~1之間的浮點數 9 time.sleep(random.random()*2) 10 t_stop = time.time() # 獲取執行結束時間 11 print(msg, "執行完畢,耗時%.2f" % (t_stop-t_start)) 12 13 14 def main(): 15 # 定義一個進程池,最大進程數是3 16 po = Pool(3) 17 for i in range(0, 10): 18 po.apply_async(worker, (i,)) 19 20 print("___start___") 21 po.close() 22 po.join() 23 print("___end___") 24 25 26 if __name__ == '__main__': 27 main()