python 2.5.2多处理池行为

python 2.5.2多处理池行为,python,module,multiprocessing,pool,Python,Module,Multiprocessing,Pool,在CentOS 5.5的2.5.2上,当试图使用python多处理模块在内核之间分割DB插入时,第一个进程完成后,整个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) p

在CentOS 5.5的2.5.2上,当试图使用python多处理模块在内核之间分割DB插入时,第一个进程完成后,整个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()
def insert():
块大小=行/ncpus
i=0

虽然我不确定这是否与您的问题有关,但您在创建的每个进程中都创建了一个新的多处理.Lock对象。
…因此,在连接提交周围获取此锁不会起任何作用

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

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

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

我不确定这是否与您的问题有关,但您正在创建一个新的多处理.lock对象,用于您创建的每个进程。
…因此,在连接提交周围获取此锁不会起任何作用

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

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

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

感谢您指出这一点。我试着用锁运行相同的代码,只是注释掉了相同的结果,所以我认为这不是问题所在。这对建立锁很有效。不过,我从来没有让池工作过,只是使用了单个进程。谢谢你指出这一点。我试着用锁运行相同的代码,只是注释掉了相同的结果,所以我认为这不是问题所在。这对建立锁很有效。不过,我从来没有让池工作过,而是使用单个进程。当你说“第一次启动完成后立即中止”时,“中止”到底是什么意思?有错误吗?您确定所有其他预期进程都在运行吗?您是否尝试添加一些日志记录/打印语句来调试它?我已通过在每次提交之前插入调试语句以及验证数据确实正在写入数据库来确认每个进程正在运行。它不会以错误结束;所有未完成的正在运行的进程都将被终止。此外,我还注意到,有时在write_db的末尾插入一个final print语句来完成多个进程。感谢您的持续帮助。请尝试在write_db方法中围绕
all
代码包装一个Try/except子句(并打印出现的任何异常)。如果存在某种类型的数据库问题(例如超过了最大连接数),则可能会导致您所遇到的问题。当您说“第一次启动完成后立即中止”时,“中止”到底是什么意思?有错误吗?您确定所有其他预期进程都在运行吗?您是否尝试添加一些日志记录/打印语句来调试它?我已通过在每次提交之前插入调试语句以及验证数据确实正在写入数据库来确认每个进程正在运行。它不会以错误结束;所有未完成的正在运行的进程都将被终止。此外,我还注意到,有时在write_db的末尾插入一个final print语句来完成多个进程。感谢您的持续帮助。请尝试在write_db方法中围绕
all
代码包装一个Try/except子句(并打印出现的任何异常)。如果存在某种类型的数据库问题(例如超过了最大连接数),则可能会导致您所遇到的问题。