在 Python 中对多处理进程实施超时
Implementing a timeout on a multiprocessing process in Python
我愿意:
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()
永远运行。为什么会出现这种情况?
q.get()
永远运行,因为它在默认情况下会阻塞,您永远不会将任何东西放入队列。
您可以使用q.get(block=False)
或q.get_nowait()
(相当于前者)。但请记住它会引发 queue.Empty
,因此您应该处理它。
我愿意:
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()
永远运行。为什么会出现这种情况?
q.get()
永远运行,因为它在默认情况下会阻塞,您永远不会将任何东西放入队列。
您可以使用q.get(block=False)
或q.get_nowait()
(相当于前者)。但请记住它会引发 queue.Empty
,因此您应该处理它。