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

哪些Python多处理输入导致超时?,python,python-2.7,multiprocessing,Python,Python 2.7,Multiprocessing,我试图理解Python中带有超时的多处理 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, ran

我试图理解Python中带有超时的
多处理

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,但我只得到少数超时

我不太明白第一个问题。当引发
TimeoutError
时,没有剩余的工作项及时完成-但这是显而易见的;-)

关于“即使任务超时,结果也会打印”:任务从不超时——它只等待可能超时的结果。如果在一秒钟内没有结果,请循环并重试。最终每个工作项都完成了,所以当然最终会为每个工作项打印结果。您可以将
timeout=1
更改为,例如,
timeout=0.01
,而这一切都不会改变(除非您会看到更频繁地打印
timeout
)<代码>超时错误并不意味着任务超时-它只意味着主程序在等待任务完成时超时。任务一直在运行

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

等待一秒钟,第一个结果就在1秒超时到期之前准备就绪。其余3个进程的剩余睡眠时间分别减少到0、2和2。打印第一个结果时,第一个进程可能会启动一个睡眠时间为1的新工作项。所以现在所有进程的剩余等待时间是1,0,2,2。事实上,第二个进程已经在处理另一个新项目,因此剩余的等待时间是1,
n
,对于
n
的某个值为2,2

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

因此,再次等待一秒钟将获取超时前第一个进程的结果,第三个和第四个进程的睡眠时间同时低于一秒钟

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

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


更清楚?

我不太明白第一个问题。当引发
TimeoutError
时,没有剩余的工作项及时完成-但这是显而易见的;-)

关于“即使任务超时,结果也会打印”:任务从不超时——它只等待可能超时的结果。如果在一秒钟内没有结果,请循环并重试。最终每个工作项都完成了,所以当然最终会为每个工作项打印结果。您可以将
timeout=1
更改为,例如,
timeout=0.01
,而这一切都不会改变(除非您会看到更频繁地打印
timeout
)<代码>超时错误并不意味着任务超时-它只意味着主程序在等待任务完成时超时。任务一直在运行

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

等待一秒钟,第一个结果就在1秒超时到期之前准备就绪。其余3个进程的剩余睡眠时间分别减少到0、2和2。打印第一个结果时,第一个进程可能会启动一个睡眠时间为1的新工作项。所以现在所有进程的剩余等待时间是1,0,2,2。事实上,第二个进程已经在处理另一个新项目,因此剩余的等待时间是1,
n
,对于
n
的某个值为2,2

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

因此,再次等待一秒钟将获取超时前第一个进程的结果,第三个和第四个进程的睡眠时间同时低于一秒钟

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

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


更清晰?

回答得很好!谢谢我意识到我问错了问题。如果时间太长的话,我真的想让任务暂停。有没有办法做到这一点?
Pool
没有类似的内置功能。您可以从一个较低级别的
多处理.Process()
调用,然后是一个带有超时的
.join()
,然后是一个
.terminate()
。或者,您可以在辅助进程中创建一个线程以使其休眠,例如,在其唤醒时执行
os.\u exit()
。或确实没有什么优雅的方法可以强制代码停止。有几种方法在这里得到了充实:很好的答案!谢谢我意识到我在问wro