python 2.5.2 多进程池行为
在使用 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()
现在你应该可以把这个锁作为参数传递给你的进程了。