2012-09-27 3 views
2

파이썬 다중 경로 패키지에서 pool.map을 사용하여 데이터베이스 연결 개체 또는 커서 개체를 전달하는 데 어려움이 있습니다. 기본적으로 각각의 상태와 db 연결을 가진 작업자 풀을 생성하여 쿼리를 병렬로 실행할 수 있습니다.파이썬 다중 처리 - 프로세스간에 사용되는 데이터베이스 연결을 초기화/전달하는 가장 좋은 방법

나는이 방법을 시도했다, 그러나 나는 그들과 함께 파이썬에서 picklingerror 무엇입니까 -

Pool Map with 2 arugements

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을 사용하고있다.

+4

당신은 ... 아마 데이터베이스 연결을 통과하고 싶지 않아요. 그들은 직렬화 할 수 없습니다. 자녀가 데이터베이스에 액세스해야하는 경우에는 자신의 연결을 설정해야 할 것입니다. –

답변

6

답변으로 의견을 올려 보겠습니다. 적절하다고 생각하기 때문입니다. 부모 프로세스에서 자식 프로세스로 데이터베이스 연결을 전달하려고하지 않으려 고합니다. 직렬화 할 수있는 정적 데이터 나 다른 객체를 하위 프로세스로 이동하려고합니다. 데이터 행 등을 전달할 수 있습니다. 또는 필요할 때 자녀가 자체 데이터베이스 연결을 설정하게 할 수 있습니다.

-1

db 연결 개체를 pickling하십시오. 산세는 공정과 무관합니다. 그래서 작동 할 수 있습니다 ..

참고 문헌이 페이지는 - python pickle
pickle examples

+1

피클은 일반적으로 db 연결이 전달 될 때마다 적합 함을 나타냅니다 (나는 여러 번 그런 일이 발생합니다. 저장 상태에서 꺼내야 함). 그래서 현명한 선택처럼 보입니다. –