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_all
및 check_functions
은 모듈 수준의 함수입니다. table_lists
은 문자열 목록의 목록입니다. cursors
은 MySQLdb 커서 객체 목록입니다.
def check_foo(cursor, table):
print "hello"
과 행운처럼 더미 기능을 대체했다.
오류가 참조하는 인스턴스 메서드는 어디에 있습니까?
그랬습니다. 감사. – jobo3208