在dask.distributed上使用期货时,有没有办法区分当前正在评估的value[1:3]
期货和仍在队列中的期货?
原因是我向一小组工人(100)提交了大量任务(~8000),因此并非所有任务都可以立即处理。这些任务涉及调用第三方可执行文件( via pending
),在极少数情况下会进入无限循环。
因此,我想取消期货已经运行太久(使用任意超时)。然而,似乎没有办法判断未来是否已经长期处于subprocess.check_output
状态,因为计算需要比平常更长的时间,或者仅仅因为它必须等待工人变得可用。
我的设置涉及分别运行pending
和dask-scheduler
作业/作业数组的SGE群集。
我尝试使用timeout_decorator package中的dask-worker
直接在提交的Python函数中设置超时,但出现以下错误:
@timeout_decorator.timeout(60, use_signals=False)
非常感谢任何帮助。
答案 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.')