python 2.5.2 多进程池行为

2 投票
1 回答
605 浏览
提问于 2025-04-17 00:07

在使用 Python 的 multiprocessing 模块进行数据库插入时,我想把这个任务分配给多个核心来处理。我的环境是 2.5.2 版本的 Python 和 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

我不确定这是否和你的问题有关,但你在每个创建的进程中都在创建一个新的 multiprocessing.Lock 对象。
...所以在你的连接提交时使用这个锁是没有用的。

[编辑] 要在进程之间共享这个锁,你需要一个管理器对象:

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

现在你应该可以把这个锁作为参数传递给你的进程了。

撰写回答