我创建了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
有什么建议吗?
答案 0 :(得分:16)
我对多处理问题的解决方案几乎总是使用Manager对象。虽然暴露的接口是相同的,但底层实现更简单,并且具有更少的错误。
from multiprocessing import Manager
manager = Manager()
result_queue = manager.Queue()
尝试一下,看看它是否无法解决您的问题。
答案 1 :(得分:5)
multiprocessing.Queue在其文档中被称为线程安全的。但是当您与Queue进行进程间通信时,它应该与multiprocessing.Manager()。Queue()
一起使用。答案 2 :(得分:2)
OP帖子中没有证据表明model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy',my_metric])
不起作用。 OP发布的代码根本不足以理解发生了什么:他们是否加入了所有流程?他们是否正确地将队列传递给子进程(如果它在Windows上必须作为参数)?他们的子进程是否验证他们实际上有10000个元组?等
OP有可能真正遇到multiprocessing.Queue
中难以重现的错误,但考虑到CPython已经完成的测试数量,以及我只运行了100个进程的事实x 10000结果毫无困难,我怀疑OP在他们自己的代码中确实存在一些问题。
是的,其他答案中提及的mp.Queue
是一种非常好的共享数据方式,但根据未经证实的报告"出现问题,没有理由避免Manager().Queue()
用它"。