在Python中实现多处理过程的超时

时间:2017-05-28 22:03:59

标签: python python-3.x timeout python-multiprocessing

我做:

import multiprocessing as mp
q = mp.Queue()
p = mp.Process(target=lambda x: x, args=('foo',))
p.start()
p.join(10)
if p.exitcode == 0:
   q.get()
else:
   print("We timed out.")

我的期望是我的小x->x功能最多会阻挡10秒。如果它在那之前完成,我会比这更早得到结果。如果它需要更长的时间(显然不是在这个玩具示例中,但在其他情况下),那么该过程在10秒后终止,我能够检查exitcode以确定我们确实已经超时。

但是当我执行这段代码时,会发生的事情是q.get()永远运行。为什么会这样?

1 个答案:

答案 0 :(得分:1)

q.get()永远运行,因为它默认情况下会阻塞,而且你永远不会把任何东西放进队列。

您可以使用q.get(block=False)q.get_nowait()(相当于前者)。但请记住它会引发queue.Empty,所以你应该处理它。