2013-06-13 1 views
1

multiprocessing.Pool 개체를 사용하여 일부 데이터베이스 쿼리를 병렬로 실행하려고합니다. 나는 MySQLdb를 사용하고있다.Pool.map()을 사용하여 인스턴스 메서드를 피클링 할 수 없지만 인스턴스 메서드가 없습니다.

나는 다음과 같이 실행 내가 쿼리를 정의하는 몇 가지 모듈 수준의 기능을 가지고 :

def check_foo(cursor, table): 
    query = "(some query)" 
    cursor.execute(query) 
    results = cursor.fetchall() 
    return len(results) == 0 

프로그램이 실행될 때이 기능은 다음과 같이 수집됩니다

if __name__ == '__main__': 
    check_functions = [v for k, v in globals().items() 
          if k.startswith('check_') and callable(v)] 

또한

def run_check_on_all((tables, cursor, f)): 
    return [f(cursor, table) for table in tables] 

테이블 수준에서 특정 검사 기능을 실행하는 모듈 수준의 기능을 가지고 있습니다. 해당 기능에 대해 run_check_on_all을 호출 할 각 검사 기능에 대해 하나의 작업자 프로세스를 갖기를 원합니다. 내가 이것을 실행하려고하면

if __name__ == '__main__': 
    ... 

    pool = multiprocessing.Pool(len(check_functions)) 
    cursors = [conn.cursor() for i in range(len(check_functions))] 

    print "Running {0} check(s)...".format(len(check_functions)) 
    table_lists = [table_list] * len(check_functions) 
    all_results = pool.map(run_check_on_all, zip(table_lists, cursors, check_functions)) 

, 나는 다음과 같은 오류 얻을 :

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/local/Python2.6/lib/python2.6/threading.py", line 532, in __bootstrap_inner 
    self.run() 
    File "/usr/local/Python2.6/lib/python2.6/threading.py", line 484, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/usr/local/Python2.6/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks 
    put(task) 
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 

당신이 (희망)를 참조하십시오이 pool.map에 호출에 관련된 아무것도없는 것처럼 여기에 그렇게 내 시도이다 인스턴스 메소드. run_check_on_allcheck_functions은 모듈 수준의 함수입니다. table_lists은 문자열 목록의 목록입니다. cursors은 MySQLdb 커서 객체 목록입니다.

나는 그것을 체크 기능의 커서 객체의 인스턴스 메소드를 호출하여해야 할 일을했을 어쩌면 생각하지만, 난 여전히이

def check_foo(cursor, table): 
    print "hello" 

과 행운처럼 더미 기능을 대체했다.

오류가 참조하는 인스턴스 메서드는 어디에 있습니까?

답변

1

문제는 프로세스간에 데이터베이스 커서 개체를 전달하려고 시도하는 것입니다. 각 프로세스는 데이터베이스에 대한 연결을 작성하고 해당 연결에 커서를 작성해야합니다.

+0

그랬습니다. 감사. – jobo3208