Python多处理失败.设置maxtasksperchild时的池



我在Linux上使用Python 2.7.8,并且在使用多处理的程序中看到了一致的失败。Pool()。当我将maxtasksperchild设置为None时,当对进程的各种值进行测试时,一切都很好。但是,如果我设置maxtasksperchild=n(n>=1),那么我总是以一个未捕获的异常结束。这是主要块:

if __name__ == "__main__":
    options = parse_cmdline()
    subproc = Sub_process(options)
    lock = multiprocessing.Lock()
    [...]
    pool = multiprocessing.Pool(processes=options.processes,
                                maxtasksperchild=options.maxtasksperchild)
    imap_it = pool.imap(recluster_block, subproc.input_block_generator())
    #import pdb; pdb.set_trace()
    for count, result in enumerate(imap_it):
        print "Count = {}".format(count)
        if result is None or len(result) == 0:
            # presumably error was reported
            continue
        (interval, block_id, num_hpcs, num_final, retlist) = result
        for c in retlist:
            subproc.output_cluster(c, lock)
    print "About to close_outfile."
    subproc.close_outfile()
    print "About to close pool."
    pool.close()
    print "About to join pool."
    pool.join()

为了调试,我添加了一个print语句,显示循环的次数。以下是一些运行:

$ $prog  --processes=2 --maxtasksperchild=2
Count = 0
Count = 1
Count = 2
Traceback (most recent call last):
  File "[...]reclustering.py", line 821, in <module>
    for count, result in enumerate(imap_it):
  File "[...]/lib/python2.7/multiprocessing/pool.py", line 659, in next
    raise value
TypeError: 'int' object is not callable
$ $prog --processes=2 --maxtasksperchild=1
Count = 0
Count = 1
Traceback (most recent call last):
[same message as above]

如果我没有设置maxtasksperchild,程序将成功运行到完成。此外,如果我取消注释"import-pdb;pdb.set_trace()"行并输入调试器,那么问题就不会出现(Heisenbug)。那么,我在这里的代码中做错了什么吗?生成输入的代码(subproc.input_block_generator)或处理它的代码(recurster_block)上是否存在已知会导致此类问题的条件?谢谢

maxtasksperchild导致多处理重新生成子进程。这个想法是为了摆脱任何正在积累的漏洞。问题是,你可以从父母那里得到新的cruft。当子进程重生时,它会得到父进程的当前状态,这与原始生成不同。您正在脚本的全局命名空间中进行工作,因此您正在更改孩子将看到的环境。具体来说,您使用了一个名为"count"的变量,该变量屏蔽了以前的"from itertools import count"语句。

要解决此问题:

  1. 使用名称空间(itertools.count,就像您在评论中所说的那样)来减少名称冲突

  2. 在函数中执行工作,这样局部变量就不会传播到子函数。

相关内容

  • 没有找到相关文章

最新更新