多处理代码在导入时起作用,在被调用时中断

时间:2015-04-28 03:04:15

标签: python import multiprocessing importerror python-multiprocessing

在名为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

那是怎么回事?为什么它在导入时表现一种方式,另一种在我尝试运行时呢?

1 个答案:

答案 0 :(得分:3)

在Windows上的交互式提示中

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的唯一方法。