Подтвердить что ты не робот

Еще одна путаница с ошибкой многопроцессорности, объект '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'
4b9b3361

Ответ 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 имеет то же имя, что и модуль:

  • test.py
  • тест /
    • __ __ INIT. Ру

в 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