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)
我对这条消息很迷茫。我在那里和其他地方都没有发现任何有用的东西。有些人建议一个错误......
要修复此错误,您需要在 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)
也可以看看:
您应该将脚本分为两部分:首先是函数/类,第二部分是创建所需的实例并调用所需的函数。
在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)
如果这对您的问题有帮助,请告诉我。
您还可以在这里找到一个很好的解释main:What does if __name__ == "__main__": do?
| 归档时间: |
|
| 查看次数: |
3891 次 |
| 最近记录: |