multiproccesing and error 进程已经分叉,你不能安全地使用这个 CoreFoundation 功能

Inf*_*per 5 python macos multiprocessing

在 Python 2.7.8 上调用我的函数 start 并使用 multiprocessing 模块时出现此错误。我使用的是 mac OS 10.9.5。

The process has forked and you cannot use this CoreFoundation functionality safely. 
You MUST exec(). Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_
COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug.
Run Code Online (Sandbox Code Playgroud)

这是类格子下的代码。我的函数 sansfin 运行良好并返回一个布尔值,它只将 self 和一个整数作为参数进行循环。

    def start(self):
        if __name__ == '__main__':
            self.run = True
            p = Process(target=self.sansfin, args=(1000,))
            p.start()
            p.join()

    def stop(self):
        self.run = False
Run Code Online (Sandbox Code Playgroud)

我对这条消息很迷茫。我在那里和其他地方都没有发现任何有用的东西。有些人建议一个错误......

Mic*_*eld 9

要修复此错误,您需要在 MacOS 上显式设置multiprocessing启动方法spawn。这可以通过在下面添加以下内容来实现if __name__ == '__main__'。例如:

import platform, multiprocessing
...
if __name__ == '__main__':
    if platform.system() == "Darwin":
        multiprocessing.set_start_method('spawn')
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  1. https://groups.google.com/forum/#!topic/psychopy-users/quulKzsQY-Y
  2. https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods
  3. https://bugs.python.org/issue33725


CoM*_*tel 0

您应该将脚本分为两部分:首先是函数/类,第二部分是创建所需的实例并调用所需的函数。

if __name__ == '__main__':这里将这两个部分分开。正如您在示例中所说的那样,我认为每个进程都会尝试自行启动,并且会永远分叉,从而导致此错误。

您的代码应如下所示:

class Lattice:
    def __init__(self):
        # init what you need

    def start(self):
        self.run = True
        p = Process(target=self.sansfin, args=(1000,))
        p.start()
        p.join()

    def stop(self):
        self.run = False

if __name__ == '__main__':
    lattice_instance=Lattice()
    lattice_instance.start()
    # wait the time you need
    lattice_instance.stop()
Run Code Online (Sandbox Code Playgroud)

如果这对您的问题有帮助,请告诉我。

您还可以在这里找到一个很好的解释mainWhat does if __name__ == "__main__": do?