一、问题描述:
在运行下面代码时出现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()