Windows环境下Python中multiprocessing关于RuntimeError异常的处理方式

前言

在上一篇博文中,我们发现下方的代码示例在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]异常,请忽略。")

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哥撩编程

多点...少点...多少给点?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值