哪些Python多处理输入导致超时?

时间:2016-07-15 01:27:19

标签: python python-2.7 multiprocessing

我试图通过超时了解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,但我只获得了一些超时。

1 个答案:

答案 0 :(得分:4)

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

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

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

等待一秒钟,第一个结果就在1秒超时到期之前准备就绪。其他3个进程中剩余的休眠时间减少到0,2和2.当您打印第一个结果时,也许第一个进程启动一个休眠时间为1的新工作项。所以现在剩下的等待时间所有进程的时间分别为1,0,2,2。实际上,第二个进程已经在处理另一个新项目,因此剩余的等待时间为1,n,2,2,某些值为{{1 }}

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

等待一秒再次从超时之前的第一个进程中获取结果,第三个和第四个进程的休眠时间同时低于每秒。

等等。等待一秒钟的结果需要第二次关闭每个进程的剩余睡眠时间,因为它们会同时运行。

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

更清晰?