파이썬 다중 경로 패키지에서 pool.map을 사용하여 데이터베이스 연결 개체 또는 커서 개체를 전달하는 데 어려움이 있습니다. 기본적으로 각각의 상태와 db 연결을 가진 작업자 풀을 생성하여 쿼리를 병렬로 실행할 수 있습니다.파이썬 다중 처리 - 프로세스간에 사용되는 데이터베이스 연결을 초기화/전달하는 가장 좋은 방법
나는이 방법을 시도했다, 그러나 나는 그들과 함께 파이썬에서 picklingerror 무엇입니까 -
이 Use Initializer to set up multiprocess pool
두 번째 링크는 내가 좋겠 의미, 내가해야 할 일을 정확히를 시작될 때 데이터베이스 연결을 여는 각 프로세스와 마찬가지로 전달 된 데이터/args를 처리하기 위해 해당 연결을 사용하십시오.
여기 내 코드가 있습니다.
import multiprocessing as mp
def process_data((id,db)):
print 'in processdata'
cursor = db.cursor()
query = ....
#cursor.execute(query)
#....
.....
.....
return row
`if __name__ == '__main__':
db = getConnection()
cursor = db.cursor()
print 'Initialised db connection and cursor'
inputs = [1,2,3,4,5]
pool = mp.Pool(processes=2)
result_list = pool.map(process_data,zip(inputs,repeat(db)))
#print result_list
pool.close()
pool.join()
이것은 다음과 같은 오류가 발생
`
-
`Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner self.run() File "/usr/lib/python2.6/threading.py", line 484, in run self.__target(*self.__args, **self.__kwargs) File "/usr/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks put(task) PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed`
내가 DB 또는 I 반복을 대체하는 경우 때문에 커서 오브젝트는, 파이썬에 따라 picklable되지 않은 추측 (dB), to repeat (x) 여기서 x는 int 또는 문자열입니다. 나는 이니셜 라이저 함수를 사용해 보았는데 초기에는 작동하지만, 쿼리를 실행할 때 이상한 일이 발생했다. 많은 사람들이 ID를 반환하지 않았는데, 데이터가있을 때 발생했다.
이것을 달성하는 가장 좋은 방법은 무엇입니까? 나는 리눅스 머신에서 파이썬 2.6.6을 사용하고있다.
당신은 ... 아마 데이터베이스 연결을 통과하고 싶지 않아요. 그들은 직렬화 할 수 없습니다. 자녀가 데이터베이스에 액세스해야하는 경우에는 자신의 연결을 설정해야 할 것입니다. –