繁体   English   中英

Python多处理队列失败

[英]Python multiprocessing Queue failure

我创建了100个子进程

proc_list = [
    Process(target = simulator, args=(result_queue,))
    for i in xrange(100)]

并开始他们

for proc in proc_list: proc.start()

在进行一些处理之后,每个进程都会将result_queue(multiprocessing.Queue的实例)10000个元组放入其中。

def simulate(alg_instance, image_ids, gamma, results,
                     simulations, sim_semaphore):
  (rs, qs, t_us) =  alg_instance.simulate_multiple(image_ids, gamma,
                                             simulations)
  all_tuples = zip(rs, qs, t_us)
  for result in all_tuples:
    results.put(result)
  sim_semaphore.release()

我应该(?)在队列中获得1000000个元组,但经过各种运行后我得到这些(样本)大小:14912 19563 12952 13524 7487 18350 15986 11928 14281 14282 7317

有什么建议?

我对多处理问题的解决方案几乎总是使用Manager对象。 虽然暴露的接口是相同的,但底层实现更简单,并且具有更少的错误。

from multiprocessing import Manager
manager = Manager()
result_queue = manager.Queue()

尝试一下,看看它是否无法解决您的问题。

多处理.Queue在其文档中被称为线程安全的。 但是当您使用Queue进行进程间通信时,它应该与multiprocessing.Manager()一起使用.Queue()

OP帖子中没有证据表明multiprocessing.Queue不起作用。 OP发布的代码根本不足以理解正在发生的事情:他们是否加入了所有流程? 他们是否正确地将队列传递给子进程(如果它在Windows上,则必须作为参数)? 他们的子进程是否验证他们实际上有10000个元组? 等等

OP有可能在mp.Queue遇到难以重现的错误,但考虑到CPython已经完成的测试数量,以及我只是运行100个进程x 10000结果而没有任何麻烦的事实,我怀疑OP实际上在他们自己的代码中遇到了一些问题。

是的, Manager().Queue()在其他答案中提到的Manager().Queue()是一种非常好的共享数据的方式,但是没有理由避免multiprocessing.Queue()基于未经证实的报告“它有问题”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM