yet another confusion with multiprocessing error, 'module' object has no attribute 'f'

匿名 (未验证) 提交于 2019-12-03 02:54:01

问题:

I know this has been answered before, but it seems that executing the script directly "python filename.py" does not work. I have Python 2.6.2 on SuSE Linux.

Code:

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

Command line:

> 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' 

回答1:

Restructure your code so that the f() function is defined before you create instance of Pool. Otherwise the worker cannot see your 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]) 


回答2:

This one works:

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

I'm not 100% sure why your code does not work, but I guess the reason is that child processes launched by the multiprocessing module try to import the main module (to have access to the methods you defined), and the if __name__ == "__main__" stanza is required not to execute the initialization code where you set up your pool.



回答3:

One possibility is that your python file has the same name as a module:

  • test.py
  • test/
    • __init__.py

in pickle.py, you have the error coming from:

    def find_class(self, module, name):       # Subclasses may override this       __import__(module)       mod = sys.modules[module] # 


回答4:

The problem I had was solved by using if __name__ == "__main__" as pointed out by Tamás; in Eclipse for Windows the examples do not work under the interpreter. This is explained in http://docs.python.org/2/library/multiprocessing



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!