我在python 2.7多处理(64位Windows)上遇到问题。假设我有一个文件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()


如果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()似乎不会影响此行为。有谁知道为什么会这样,或者如何解决?

最佳答案

问题在于您如何在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

关于python - 在导入的多处理处理器子类上使用.start()时出现IOerror,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34568146/

10-10 21:16
查看更多