問題描述:在運行下面代碼時出現RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.
# TODO 進程池的使用
from multiprocessing import Pool
import os, time, random
def worker(msg):
t_start = time.time()
print("%s開始執行,進程號為%d" % (msg,os.getpid()))
# random.random()隨機生成0~1之間的浮點數
time.sleep(random.random()*2)
t_stop = time.time()
print(msg,"執行完畢,耗時%0.2f" % (t_stop-t_start))
# 定義一個進程池,最大進程數3
p = Pool(3)
for i in range(0,10):
# Pool().apply_async(要調用的目標,(傳遞給目標的參數元祖,))
# 每次循環將會用空閑出來的子進程去調用目標
p.apply_async(worker,(i,))
print("----start----")
p.close() # 關閉進程池,關閉后po不再接收新的請求
p.join() # 等待po中所有子進程執行完成,必須放在close語句之后
print("-----end-----")
解決方法:通過main方法來執行python文件
# TODO 進程池的使用
from multiprocessing import Pool
import os, time, random
def worker(msg):
t_start = time.time()
print("%s開始執行,進程號為%d" % (msg,os.getpid()))
# random.random()隨機生成0~1之間的浮點數
time.sleep(random.random()*2)
t_stop = time.time()
print(msg,"執行完畢,耗時%0.2f" % (t_stop-t_start))
def main():
# 定義一個進程池,最大進程數3
p = Pool(3)
for i in range(0,10):
# Pool().apply_async(要調用的目標,(傳遞給目標的參數元祖,))
# 每次循環將會用空閑出來的子進程去調用目標
p.apply_async(worker,(i,))
print("----start----")
p.close() # 關閉進程池,關閉后po不再接收新的請求
p.join() # 等待po中所有子進程執行完成,必須放在close語句之后
print("-----end-----")
if __name__ == '__main__':
main()
運行結果: