我需要在一段代码中使用多处理,这段代码以字符串形式注入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位。
更新:...还有一个更普遍的问题:是否可以在另一个进程中异步运行用户定义的脚本(存储在字符串中)?这实际上是我试图实现的目标。
答案 0 :(得分:1)
我认为您可能会遇到与此处所见相同的缩进问题:Python AttributeError: Object has no attribute请尝试确保您的print和exec行已正确标记。
答案 1 :(得分:0)
multiprocessing
要求 target
函数可以通过__main__
模块中的子进程导入。这里,所述模块没有定义f
,因此不满足约束(即使某些操作系统设法让你放松约束,这是一种可怕的做法,并且会破坏代码的可移植性)。
我建议您分析code
字符串,例如通过compile
内置字符串,并确保所需__main__
的{{1}}级定义。
答案 2 :(得分:0)
这是一个老问题......无论如何,以下工作:
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)