python 2.5.2多处理池行为

时间:2011-08-22 17:16:16

标签: python module multiprocessing pool

当尝试使用2.5.2,CentOS 5.5上的python多处理模块在核心之间划分数据库插入时,整个第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 docs中的这句话有关: 此外,传入函数仅在池中的一个工作程序中执行

也许内置MP和我不知道的MP模块之间存在一些差异。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不确定这是否与您的问题有关,但您在创建的每个流程中都创建了 new multiprocessing.Lock对象。
...所以在你的连接提交中获取这个锁是不会做任何事情的。

[编辑]为了在进程之间共享此锁,您需要一个管理器对象:

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

现在您应该能够将此锁作为参数传递给您的进程。