При попытке разделить вставку БД между ядрами с помощью модуля многопроцессорной обработки python в 2.5.2, CentOS 5.5, весь пул из 16 процессов прерывается, как только завершается первый.Я думал, что использование pool.close / pool.join должно было предотвратить возникновение этой вещи.
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 документы : Кроме того, переданная функция выполняется только на одном из рабочих пулов
Возможно, существует некоторая разница между встроенным MP и модулем MP, о которой я не знаю.
Спасибо за помощь.