又一个混乱的多处理错误,'模块'对象没有属性'f'

我知道这已经回答了,但似乎直接执行脚本“python filename.py”不起作用。 我在SuSE Linux上有Python 2.6.2。

码:

#!/usr/bin/python # -*- coding: utf-8 -*- from multiprocessing import Pool p = Pool(1) def f(x): return x*x p.map(f, [1, 2, 3]) 

命令行:

 > python example.py Process PoolWorker-1: Traceback (most recent call last): File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap self.run() File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python2.6/multiprocessing/pool.py", line 57, in worker task = get() File "/usr/lib/python2.6/multiprocessing/queues.py", line 339, in get return recv() AttributeError: 'module' object has no attribute 'f' 

重新构造代码,以便在创build池实例之前定义f()函数。 否则,工人看不到你的function。

 #!/usr/bin/python # -*- coding: utf-8 -*- from multiprocessing import Pool def f(x): return x*x p = Pool(1) p.map(f, [1, 2, 3]) 

这个工作:

 #!/usr/bin/python # -*- coding: utf-8 -*- from multiprocessing import Pool def f(x): return x*x if __name__ == "__main__": p = Pool(1) p.map(f, [1, 2, 3]) 

我不是100%确定为什么你的代码不起作用,但我想是因为multiprocessing模块启动的subprocess尝试导入主模块(以访问您定义的方法),并且if __name__ == "__main__"节不需要在设置池的地方执行初始化代码。

一种可能是你的python文件和模块有相同的名字:

  • test.py
  • testing/
    • __init__.py

在pickle.py中,你有错误来自:

  def find_class(self, module, name): # Subclasses may override this __import__(module) mod = sys.modules[module] # <- here mod will reference your test/__init__.py klass = getattr(mod, name) return klass 

我所遇到的问题是通过使用if __name__ == "__main__" Tamás指出的if __name__ == "__main__"来解决的; 在Eclipse for Windows中,示例在解释器下不起作用。 这在http://docs.python.org/2/library/multiprocessing中有解释;