2011-08-22 4 views
2

CentOS 5.5의 Python 다중 처리 모듈을 사용하여 코어 사이에서 DB 삽입을 분할하려고 시도하면 첫 번째 프로세스가 완료 되 자마자 16 개 프로세스의 전체 풀이 중단됩니다. pool.close/pool.join을 사용하면이 문제가 발생하지 않도록해야한다고 생각했습니다.python 2.5.2 다중 처리 풀 동작

def insert(): 
    blocksize=lines/ncpus 
    i=0 
    while i<lines: 
     print 'writing block %d to %d' % (i,i+blocksize+ncpus) 
     pool.apply_async(write_db, (i,i+blocksize+ncpus,query,)) 
     i+=blocksize+ncpus 
    pool.close() 
    pool.join() 

def write_db(start,stop,q): 
    ctr=0 
    odbcstring"...." 
    con = pyodbc.connect(odbcstring) 
    cur = con.cursor() 

    commitlock = multiprocessing.Lock() 

    for j in range(start,stop): 
     try: 
      cur.execute(q[j]) 
      ctr+=1 
      if (ctr%10000)==0: 
       commitlock.acquire() 
       con.commit() 
       commitlock.release() 
     except: 
      print get_exception_info()   

    commitlock.acquire() 
    con.commit() 
    commitlock.release() 
    con.close() 

나는 그것이 pool.apply docs에서이 문장을 함께 할 수있는 뭔가가 이론화하고 있습니다 : 또한, 유일한

아마도이 풀의 노동자 중 하나에서 실행되는 기능 전달 내장 MP와 내가 모르는 MP 모듈 사이에 약간의 차이가 있습니다.

도움 주셔서 감사합니다.

+0

"끝날 때마다 즉시 중단합니다"라고 말하면 "중단"이란 정확히 무엇을 의미합니까? 오류가 있습니까? 다른 모든 예상 프로세스가 실행되고 있습니까? 디버깅을 위해 몇 가지 로그/인쇄 문을 추가해 보았습니까? – Gerrat

+0

각 커밋 전에 디버깅 문을 삽입하고 실제로 데이터가 DB에 기록되는지 확인함으로써 각 프로세스가 실행되고 있음을 확인했습니다. 오류로 끝나지 않습니다. 완료되지 않은 모든 실행중인 프로세스는 단순히 종료됩니다. 또한 write_db 끝에 최종 인쇄 문을 삽입하여 여러 프로세스가 완료되는 경우도 있습니다. 지속적인 도움에 감사드립니다. – jordanpg

+0

write_db 메소드의'all' 코드 주위에 try/except 절을 래핑 해보십시오 (발생하는 예외를 출력하십시오). 최대 연결 수가 초과 된 것과 같은 일종의 데이터베이스 문제가 발생하면 문제가 발생할 수 있습니다. – Gerrat

답변

0

문제와 관련이 있는지는 잘 모르겠지만 작성하는 모든 프로세스에서 다중 처리. 잠금 개체를 만듭니다.
... 연결 커밋 주변에서이 잠금을 얻는 것은 아무 것도하지 않을 것입니다.

manager = multiprocessing.Manager() 
lock = manager.Lock() 

지금 당신은 당신의 프로세스에 인수로이 잠금 장치를 통과 할 수 있어야한다 :

는 [ 는 편집] 프로세스 사이의 잠금을 공유하려면, 당신은 관리자 오브젝트가 필요합니다.

+0

그 점을 지적 해 주셔서 감사합니다. 나는 같은 결과로 주석 처리 된 자물쇠를 사용하여 동일한 코드를 실행하려고 시도 했으므로 그 것이 문제라고 생각하지 않습니다. – jordanpg

+0

잠금 장치를 설정하는 데는 효과가있었습니다. 나는 수영장을 일하게 만들지 못했지만 대신에 개별적인 프로세스를 사용했습니다. – jordanpg