前言
在上一篇博文中,我们发现下方的代码示例在Linux、Mac系统上是可以正常执行的,但是如果是在Windows系统执行就会抛出RuntimeError异常。
虽然上一篇博文有针对该RuntimeError异常作出处理,但是我还是觉得针对该问题需要单独提出来一下(因为很有纪念意义,?)
经过网络搜集相关信息,得出一个初步的判断,具体对不对我也不知如何验证。这里姑且借前人之言说一下。
造成该异常是因为 Windows系统下在Pycharm 运行 multiprocessing 造成的进程阻塞产生的。
代码示例如下:
from multiprocessing import Pool
import os
import time
import 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))
po = Pool(3) # 定义一个进程池,最大进程数:3
for i in range(0, 10):
# Pool().apply_async(要调用的目标, (传递给目标的参数元组,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker, (i,))
print("-----start-----")
po.close() # 关闭进程池,关闭后po不再接收新的语句
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
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.
RuntimeError异常的解决方法
设置函数入口
from multiprocessing import Pool
import os
import time
import 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))
if __name__ == "__main__":
po = Pool() # 定义一个进程池,最大进程数:3
for i in range(0, 10):
# Pool().apply_async(要调用的目标, (传递给目标的参数元组,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker, (i,))
print("-----start-----")
po.close() # 关闭进程池,关闭后po不再接收新的语句
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")
抛出RuntimeError异常
from multiprocessing import Pool
import os
import time
import random
try:
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))
# if __name__ == "__main__":
po = Pool() # 定义一个进程池,最大进程数:3
for i in range(0, 10):
# Pool().apply_async(要调用的目标, (传递给目标的参数元组,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker, (i,))
print("-----start-----")
po.close() # 关闭进程池,关闭后po不再接收新的语句
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")
except RuntimeError:
print("multiprocessing 在 'Windows'系统下的[RuntimeError]异常,请忽略。")