【问题标题】:IOerror when using .start() on imported multiprocessing processor subclass在导入的多处理处理器子类上使用 .start() 时出现 IOerror
【发布时间】:2016-04-06 16:59:12
【问题描述】:

我在使用 python 2.7 多处理(64 位窗口)时遇到问题。假设我有一个文件pathfinder.py,代码如下:

import multiprocessing as mp

class MWE(mp.Process):
    def __init__(self, n):
        mp.Process.__init__(self)
        self.daemon = True
        self.list = []
        for i in range(n):
            self.list.append(i)

    def run(self):
        print "I'm running!"

if __name__=='__main__':
    n = 10000000
    mwe = MWE(n)
    mwe.start()

对于任意大的 n 值,此代码都可以正常执行。但是,如果我随后在另一个文件中导入并运行一个类实例

from pathfinder import MWE

mwe = MWE(10000)
mwe.start()

我得到以下回溯 if n >= ~ 10000

Traceback (most recent call last):
  File <filepath>, in <module>
    mwe.start()
  File "C:\Python27\lib\multiprocessing\process.py", line 130, in start
    self._popen = Popen(self)
  File "C:\Python27\lib\multiprocessing\forking.py", line 280, in __init__
    to_child.close()
IOError: [Errno 22] Invalid argument

我认为这可能是某种竞争条件错误,但使用 time.sleep 延迟 mwe.start() 似乎不会影响此行为。有谁知道为什么会发生这种情况,或者如何解决它?

【问题讨论】:

    标签: python windows multiprocessing


    【解决方案1】:

    问题在于您如何在 Windows 中使用 multiprocessing。导入定义 Process 类的模块时,例如:

    from pathfinder import MWE
    

    您必须将运行代码封装在if __name__ == '__main__': 块中。因此,将您的客户端代码更改为:

    from pathfinder import MWE
    if __name__ == '__main__':
        mwe = MWE(10000)
        mwe.start()
        mwe.join()
    

    (另外,请注意,您想在某个时候join() 您的进程。)

    查看特定于 Windows 的 Python 限制文档https://docs.python.org/2/library/multiprocessing.html#windows

    有关类似问题,请参阅 https://stackoverflow.com/a/16642099/1510289https://stackoverflow.com/a/20222706/1510289

    【讨论】:

    • 谢谢。不幸的是,在我发现这个问题的用例中,它是由导入时执行代码的其他文件引起的(设置单例等);对 Process 的唯一调用是在 name =='main' 块中,但显然问题仍然存在。我想我将不得不重写。
    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 2011-10-24
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多