UFO ET IT

다중 처리 오류와의 또 다른 혼동, '모듈'개체에 'f'속성이 없습니다.

ufoet 2020. 11. 23. 20:40
반응형

다중 처리 오류와의 또 다른 혼동, '모듈'개체에 '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'

f()Pool의 인스턴스를 만들기 전에 함수가 정의 되도록 코드를 재구성합니다 . 그렇지 않으면 작업자가 귀하의 기능을 볼 수 없습니다.

#!/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모듈에 의해 시작된 자식 프로세스 가 기본 모듈을 가져 오려고 시도하고 (사용자가 정의한 메서드에 액세스하기 위해) if __name__ == "__main__"스탠자가 필요하지 않기 때문이라고 생각합니다. 풀을 설정 한 초기화 코드를 실행합니다.


한 가지 가능성은 파이썬 파일이 모듈과 같은 이름을 가지고 있다는 것입니다.

  • 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] # <- here mod will reference your test/__init__.py
      klass = getattr(mod, name)
      return klass

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


This comes from the fact that with p = Pool(1) the main process forks processes (threads vs processes) before it creates the function f. As stated in Bartosz answer the spawned processes do not have access to the new function.

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

참고URL : https://stackoverflow.com/questions/2782961/yet-another-confusion-with-multiprocessing-error-module-object-has-no-attribu

반응형