另一个与多处理错误相混淆的地方是,‘ module’对象没有属性‘ 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'
40434 次浏览

这个管用:

#!/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模块启动的子进程尝试导入主模块(访问你定义的方法) ,和 if __name__ == "__main__"节是必需的,不执行初始化代码在您设置池。

重新构造代码,以便在创建 Pool 实例之前定义 f()函数。否则,工作者将无法看到您的函数。

#!/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])

一种可能性是,python 文件与模块具有相同的名称:

  • Test.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

正如 Tamás 指出的,我用 if __name__ == "__main__"解决了这个问题; 在 Eclipse for Windows 中,示例不能在解释器下工作。 这在 Http://docs.python.org/2/library/multiprocessing

这是因为在使用 p = Pool(1)时,主进程在创建函数 f 之前分叉进程(线程与进程)。如 Bartosz 中所述,衍生进程不能访问新函数。

def f1(x):
...


p = Pool(1) # p is spawned and is now an independent process, knows f1


def f(x): # p doesn't not share this object
...