【问题标题】:How to set up python multiprocessing on Windows如何在 Windows 上设置 python 多处理
【发布时间】:2019-05-22 09:03:00
【问题描述】:

我正在使用Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32 中的multiprocessing 模块。

我正在尝试使用网上找到的最简单的玩具代码:

from multiprocessing import Process

def foo():
    print('hello')

p = Process(target=foo)
p.start()

我尝试过使用和不使用if __name__ == "__main__":

我不断收到错误:

OSError: [Errno 22] Invalid argument: 'C:\\Users\\pboswell003\\PwC_Projects\\anonymize_SAP\\anonymization\\SAP\\<input>'

我很困惑&lt;input&gt; 部分应该是什么,以及它究竟试图打开什么文件。

更新:我接受了@ShadowRanger 的建议并尝试从脚本运行。现在,我遇到了无法调试正在发生的事情的问题。也就是说,似乎什么都没有发生。如果我将time.sleep(10) 添加到函数中,脚本会同时执行,这让我相信工人没有被生成和使用。

新问题:当我从命令行界面运行脚本时,如何以交互方式测试我的代码并查看工作线程的结果?

【问题讨论】:

    标签: python python-3.x windows multiprocessing python-multiprocessing


    【解决方案1】:

    您很可能通过交互式解释器执行此操作。

    1. 不要在带有multiprocessing 模块的Windows 上(或者根本不这样做);编写一个简短的脚本,使用它(或使用没有分叉模拟问题的线程)
    2. if __name__ == '__main__': 防护在 Windows 上是非可选的;没有它会发生可怕的事情。它必须存在,并且必须防止任何Process 的启动(包括通过Pool);没有保护的顶级Process 发布是一个 的想法。这是一个独特的 Windows 问题,因为在 Windows 上使用的分叉模拟依赖于该守卫,以允许它重新初始化每个子进程中 __main__ 模块的状态,模拟一个分叉;如果守卫不在那里,您最终会尝试创建更多子进程,从而创建更多子进程,等等。这是一个进程生成炸弹,不要这样做。

    【讨论】:

    • 抱歉延迟回复。新年快乐!感谢您的反馈,我有一些后续问题。我已经编辑了我的问题以包括采取的其他步骤和一个新问题
    • @PabloBoswell:我无法重现您的问题。这是an online adaptation of your codeset_start_method 用于匹配multiprocessing 在 Windows 上的行为);它按预期运行,包括在进程退出前休眠 10 秒。
    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 2017-01-13
    • 2014-11-20
    • 2020-07-18
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多