在名为test.py
的文件中,我有
print 'i am cow'
import multi4
print 'i am cowboy'
并在multi4.py
我有
import multiprocessing as mp
manager = mp.Manager()
print manager
我对此代码的运行方式感到困惑。
在命令行中,如果我键入python
,然后在python环境中键入import test.py
,我会得到预期的行为:
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information.
>>>import test
i am cow
<multiprocessing.managers.SyncManager object at 0x025209B0>
i am cowboy
>>>
但是如果我在命令行输入test.py
,我会得到
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
i am cow
除非我杀了它,否则大概会继续下去。当我杀了它时,我得到了一堆重复的错误:
KeyboardInterrupt
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\lib\multiprocessing\forking.py", line 373, in main
prepare(preparation_data)
File "C:\Python27\lib\multiprocessing\forking.py", line 488, in prepare
'__parents_main__', file, path_name, etc
KeyboardInterrupt
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\lib\multiprocessing\forking.py", line 373, in main
prepare(preparation_data)
File "C:\Python27\lib\multiprocessing\forking.py", line 488, in prepare
'__parents_main__', file, path_name, etc
KeyboardInterrupt
那是怎么回事?为什么它在导入时表现一种方式,另一种在我尝试运行时呢?
答案 0 :(得分:3)
multiprocessing
won't work properly,因为它无法在它生成的子进程中正确地重新导入__main__
。但是,实际上实际上帮助你,因为它使manager = mp.Manager()
行不会在Manager
启动时生成的子进程中以递归方式执行。
但是,在实际的脚本中,孩子可以正确地重新导入__main__
。您正在看到无限递归,因为您没有使用mp.Manager()
后卫保护if __name__ == "__main__":
的来电,required on Windows阻止mp.Manager()
在儿童中被执行重新导入时:
import multiprocessing as mp
if __name__ == "__main__":
manager = mp.Manager()
print manager
修改强>
您的主脚本(test.py)导入创建Manager
的模块的示例需要进行一些重构。您需要通过调用实际使用Manager
的模块中的方法从主脚本中实例化multiprocessing
:
print 'i am cow'
import multi4
if __name__ == "__main__":
multi4.init_manager()
print 'i am cowboy'
<强> multi4.py 强>
import multiprocessing as mp
manager = None
def init_manager():
global manager
manager = mp.Manager()
这是确保在实际执行脚本时仅创建Manager
的唯一方法。