RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.


問題描述:在運行下面代碼時出現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()

 運行結果:

 


免責聲明!

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



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