Еще одна путаница с ошибкой многопроцессорности, объект 'module' не имеет атрибута 'f'
Я знаю, что это было ответили ранее, но кажется, что выполнение script непосредственно "python filename.py" не работает. У меня Python 2.6.2 на SuSE Linux.
код:
#!/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'
Ответы
Ответ 1
Реструктурируйте свой код, чтобы функция 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])
Ответ 2
Это работает:
#!/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__"
требуется не выполнять код инициализации, где вы настраиваете свой пул.
Ответ 3
Одна из возможностей заключается в том, что ваш файл python имеет то же имя, что и модуль:
в 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
Ответ 4
Проблема, с которой я столкнулась, была решена с помощью if __name__ == "__main__"
, как указано Tamás; в Eclipse для Windows примеры не работают под интерпретатором.
Это объясняется в
http://docs.python.org/2/library/multiprocessing