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 모듈 사이에 약간의 차이가 있습니다.
도움 주셔서 감사합니다.
"끝날 때마다 즉시 중단합니다"라고 말하면 "중단"이란 정확히 무엇을 의미합니까? 오류가 있습니까? 다른 모든 예상 프로세스가 실행되고 있습니까? 디버깅을 위해 몇 가지 로그/인쇄 문을 추가해 보았습니까? – Gerrat
각 커밋 전에 디버깅 문을 삽입하고 실제로 데이터가 DB에 기록되는지 확인함으로써 각 프로세스가 실행되고 있음을 확인했습니다. 오류로 끝나지 않습니다. 완료되지 않은 모든 실행중인 프로세스는 단순히 종료됩니다. 또한 write_db 끝에 최종 인쇄 문을 삽입하여 여러 프로세스가 완료되는 경우도 있습니다. 지속적인 도움에 감사드립니다. – jordanpg
write_db 메소드의'all' 코드 주위에 try/except 절을 래핑 해보십시오 (발생하는 예외를 출력하십시오). 최대 연결 수가 초과 된 것과 같은 일종의 데이터베이스 문제가 발생하면 문제가 발생할 수 있습니다. – Gerrat