【问题标题】:Which Python multiprocessing inputs resulted in a timeout?哪些 Python 多处理输入导致超时?
【发布时间】:2016-07-15 01:27:19
【问题描述】:

我正在尝试理解 Python 中的 multiprocessing 超时。

import multiprocessing
import time
import random

def do_something(i):
    x = random.randint(1, 3)
    time.sleep(x)    
    return (i, x)

pool = multiprocessing.Pool(processes=4)
results = pool.imap_unordered(do_something, range(50))

while True:
    try:
        result = results.next(timeout=1)
        print result

    except StopIteration:
        break

    except multiprocessing.TimeoutError:
        print "Timeout"

问题:

1) 如何为每个任务设置超时时间,以便知道哪些输入导致超时?在上面的示例中,即使任务超时,似乎也会打印结果,所以我不知道哪个任务很慢。

2) 为什么不是所有睡眠时间超过 1 秒的任务都超时?尽管大约 2/3 的随机 x 大于 1,但我只得到了少数超时。

【问题讨论】:

    标签: python python-2.7 multiprocessing


    【解决方案1】:

    我不太明白第一个问题。当TimeoutError 被提出时,没有剩余的工作项目及时完成 - 但这很明显;-)

    关于“似乎即使任务超时也会打印结果”:任务从不超时 - 它只是在等待可能超时的结果。如果在一秒钟内没有准备好结果,则循环并重试。最终每个工作项都会完成,因此当然最终会为每个工作项打印一个结果。您可以将 timeout=1 更改为,例如,timeout=0.01,这不会发生任何变化(除非您会更频繁地看到 Timeout 打印)。 TimeoutError 并不意味着任务超时 - 它仅意味着 main 程序在等待任务完成时超时。任务继续运行。

    对于第二个问题,请多考虑。例如,假设您从 4 个进程开始,睡眠时间分别为 1、1、3 和 3。

    您稍等片刻,第一个结果就在 1 秒超时到期之前准备就绪。其他 3 个进程中剩余的睡眠时间减少到 0、2 和 2。当您打印第一个结果时,也许第一个进程会启动一个睡眠时间为 1 的新工作项。所以现在剩余的等待时间跨越所有进程都是 1, 0, 2, 2。事实上,第二个进程已经在处理另一个新项目,所以剩余的等待时间是 1, n, 2, 2 for some value of n.

    循环循环并立即从第二个进程中获取结果。跨进程的等待时间现在略小于 1、n、2、2。

    所以再次等待一秒钟会在超时之前从第一个进程中获取结果,并且第三个和第四个进程的睡眠时间同时都低于一秒。

    等等。等待一秒钟的结果会同时减少 每个 进程的剩余睡眠时间,因为它们是同时运行的。

    我敢打赌,如果您将 Pool 构造函数更改为 processes=1,您会看到预期的行为。 然后你会看到每次进程选择睡眠时间 2 时至少有一次超时,每次进程选择睡眠时间 3 时你会看到至少两次超时。但是当你'同时运行 4 个进程,它们的剩余睡眠时间都同时减少。

    更清楚?

    【讨论】:

    • 很好的答案!谢谢!我意识到我问错了问题。如果需要太长时间,我实际上希望有一个任务超时。有没有办法做到这一点?
    • Pool 没有内置类似的东西。您可以在较低级别的multiprocessing.Process() 调用中滚动自己的调用,然后是带有超时的.join(),然后是.terminate() .或者你可以在工作进程中创建一个线程来休眠,例如,当它醒来时执行os._exit()。或者......确实没有优雅的方式来强制代码停止。这里充实了几种方法:stackoverflow.com/questions/492519/timeout-on-a-function-call
    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多