如何区分排队和正在运行的期货(并杀死已运行太久的期货)

时间:2017-08-17 00:00:28

标签: python dask dask-distributed

在dask.distributed上使用期货时,有没有办法区分当前正在评估的value[1:3]期货和仍在队列中的期货?

原因是我向一小组工人(100)提交了大量任务(~8000),因此并非所有任务都可以立即处理。这些任务涉及调用第三方可执行文件( via pending),在极少数情况下会进入无限循环。

因此,我想取消期货已经运行太久(使用任意超时)。然而,似乎没有办法判断未来是否已经长期处于subprocess.check_output状态,因为计算需要比平常更长的时间,或者仅仅因为它必须等待工人变得可用。

我的设置涉及分别运行pendingdask-scheduler作业/作业数组的SGE群集。 我尝试使用timeout_decorator package中的dask-worker直接在提交的Python函数中设置超时,但出现以下错误:

@timeout_decorator.timeout(60, use_signals=False)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

不,您无法确定任务是否已开始执行。通常我们建议将此逻辑放在任务本身中,就像您尝试使用超时装饰器一样。

我建议您尝试timeout=关键字subprocess.check_outputs。我怀疑这会更简单,并且有更高的顺利工作机会。

答案 1 :(得分:0)

对于运行Python 2的用户,timeout=中没有subprocess.check_output关键字。

我可以使用subprocess.Popen来获得所需的效果,而不是立即返回:

import subprocess
import shlex  # useful to split up arguments for subprocess
import time

p = subprocess.Popen(shlex.split('/path/to/binary arg1 arg2'),
                     stderr=subprocess.STDOUT)
for _ in range(60):  # wait for up to 60 seconds
    if p.poll() is not None:
        break  # process completed
    else:
        time.sleep(1.0)  # give it more time
if p.poll() is None:  # time is up, are we done?
    try:
        p.kill()
    except:
        raise
    raise RuntimeError('Binary failed to complete in time.')