поведение многопроцессорного пула Python 2.5.2 - PullRequest
2 голосов
/ 22 августа 2011

При попытке разделить вставку БД между ядрами с помощью модуля многопроцессорной обработки 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, о которой я не знаю.

Спасибо за помощь.

1 Ответ

0 голосов
/ 22 августа 2011

Я не уверен, что это как-то связано с вашей проблемой, но вы создаете новый multiprocessing.Lock объект в каждом создаваемом вами процессе.
... так что получение этой блокировки вокруг ваших коммитов соединения ничего не сделает.

[ EDIT ] Чтобы разделить эту блокировку между процессами, вам нужен объект менеджера:

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

Теперь вы сможете передавать эту блокировку в качестве аргумента своим процессам.

...