3

클래스 메서드를 병렬로 실행하려고하지만 해결할 수없는 오류가 발생합니다. 내 코드입니다 : 내가 우분투 머신에서이 코드를 실행하면클래스 메소드에서 파이썬 모듈의 concurrent.futures를 사용할 수없는 이유는 무엇입니까?

import concurrent.futures as futures 

samples = ['asfd', 'zxcv', 'asf', 'qwer'] 

class test: 
    def __init__(self, samples): 
     maturedb = {} 
     with futures.ProcessPoolExecutor() as exe: 
      for samplename, dResult in exe.map(self.make_readdb, samples): 
       maturedb[samplename] = dResult 
     print(maturedb) 

    def make_readdb(self, samplename): 
     return samplename, 1 

test(samples) 

, 다음과 같은 오류가 발생합니다

방법의 make_readdb 그냥 예를 만들기 위해 단순화되어 있지만, 그것은 병목
Traceback (most recent call last): 
    File "/usr/lib/python3.2/multiprocessing/queues.py", line 272, in _feedsend(obj) 
    _pickle.PicklingError: Can't pickle <class 'method'>: attribute lookup builtins.method failed 

실제 코드와 나는 그것을 평행하게 만들 필요가있다. 도와주세요. docs에서

+2

코드가 파이썬 3.3에서 작동합니다. – jfs

+0

파이썬 3.5.2에서 코드를 테스트했는데 잘 작동했습니다. 모든 답변에 많은 감사드립니다. – user2028191

답변

1

:

ProcessPoolExecutor 클래스는 비동기 호출을 실행하는 프로세스의 풀 를 사용하는 집행자의 서브 클래스입니다. ProcessPoolExecutor는 다중 처리 모듈을 사용하므로 전역 인터프리터 잠금을 사이드 스텝 할 수 있지만 픽업 가능 개체 만 이 실행되고이 반환 될 수 있음을 의미합니다. make_readdb - - 클래스 test의 구성원 인

내가 다시 코드를 통해 보이는 ThreadPoolExecutor

업데이트

을 시도, 문제는 기능이 있다는 것입니다. 리팩토링하고이 기능을 꺼낼 수 있습니까?

+0

멀티 스레딩이 전혀 도움이되지 않습니다. cPython은 한 번에 하나의 스레드 만 실행하므로 ThreadPoolExecutor를 사용하면 속도가 훨씬 느려집니다. 이 경우 단일 스레드 설계는 ~ 600 초가 걸렸지 만 ThreadPoolExecutor는 ~ 1300 초가 걸렸습니다. – user2028191

+1

작업 CPU가 바운드입니까 아니면 IO 바운드입니까? max_workers에 어떤 가치를 사용하셨습니까? ProcessPoolExecutor를 호출 할 때 기본값은 시스템의 프로세서 수입니다. – Owen

관련 문제