执行命令中的多处理

multiprocessing inside exec command

我需要在一段代码中使用多处理,该代码作为字符串注入到 exec 函数中:

code = """
from multiprocessing import Process

def f(name):
    print('hello', name)

p = Process(target=f, args=('bob',))
p.start()
p.join()
"""

if __name__ == '__main__':
   exec(code)

我收到以下错误:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Programming\WinPython-64bit-3.3.5.0\python-3.3.5.amd64\lib\multiprocessing\forking.py", line 351, in main
self = load(from_parent)
AttributeError: 'module' object has no attribute 'f'

我对多处理很陌生...我必须说我不知道​​哪里出了问题。我的系统是 Windows 7 64 位。

更新:...还有一个更普遍的问题:是否可以在另一个进程中异步运行用户定义的脚本(存储在字符串中)?这实际上是我试图实现的目标。

multiprocessing 要求 target 函数可由 __main__ 模块的子进程导入。在这里,所述模块未定义 f,因此不满足约束(即使某些操作系统设法让您放宽约束,但这是糟糕的做法,并且会破坏代码的可移植性)。

我建议分析 code 字符串,例如通过 compile 内置,并确保所需 target__main__ 级定义。

我认为您可能 运行 遇到与此处所见相同的缩进问题:Python AttributeError: Object has no attribute 尝试确保您的 print 和 exec 行正确制表。

这是一个老问题...无论如何,以下工作:

script = """
from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
"""
exec(script)