当尝试使用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模块之间存在一些差异。
感谢您的帮助。
答案 0 :(得分:0)
我不确定这是否与您的问题有关,但您在创建的每个流程中都创建了 new multiprocessing.Lock对象。
...所以在你的连接提交中获取这个锁是不会做任何事情的。
[编辑]为了在进程之间共享此锁,您需要一个管理器对象:
manager = multiprocessing.Manager()
lock = manager.Lock()
现在您应该能够将此锁作为参数传递给您的进程。