Python 如何区分排队期货和正在运行的期货(以及终止已运行太长时间的期货)

Python 如何区分排队期货和正在运行的期货(以及终止已运行太长时间的期货),python,dask,dask-distributed,Python,Dask,Dask Distributed,在dask.distributed上使用期货时,是否有办法区分当前正在评估的待定的期货和仍在队列中的期货 原因是我将大量任务(~8000)提交给一组较小的工作人员(100),因此并非所有任务都可以立即处理。这些任务涉及调用第三方可执行文件(通过子流程。检查输出),在某些罕见的情况下,该文件会进入无限循环 因此,我想取消运行时间过长的期货(使用任意超时)。然而,似乎没有办法判断未来是否长期处于“挂起”状态,因为计算时间比平常长,或者仅仅因为它必须等待一个工作人员可用 我的设置涉及一个SGE集群,该

在dask.distributed上使用期货时,是否有办法区分当前正在评估的
待定的
期货和仍在队列中的期货

原因是我将大量任务(~8000)提交给一组较小的工作人员(100),因此并非所有任务都可以立即处理。这些任务涉及调用第三方可执行文件(通过
子流程。检查输出
),在某些罕见的情况下,该文件会进入无限循环

因此,我想取消运行时间过长的期货(使用任意超时)。然而,似乎没有办法判断未来是否长期处于“挂起”状态,因为计算时间比平常长,或者仅仅因为它必须等待一个工作人员可用

我的设置涉及一个SGE集群,该集群分别运行
dask调度程序
dask工作者
job/job数组。 我尝试直接在提交的Python函数中使用
@timeout\u decorator.timeout(60,use\u signals=False)
设置超时,但出现以下错误:

"daemonic processes are not allowed to have children"

非常感谢您的帮助。

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


我建议改为尝试将
timeout=
关键字添加到
子流程。检查输出本身。我认为这样做会更简单,工作更顺利。

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


我建议改为尝试将
timeout=
关键字添加到
子流程。检查输出本身。我认为这样做会更简单,工作更顺利。

对于运行Python 2的用户,
timeout=
关键字在
子流程中不可用。请检查输出

我能够通过使用
subprocess.Popen
获得所需的效果,它会立即返回:

导入子流程
import shlex#用于拆分子流程的参数
导入时间
p=subprocess.Popen(shlex.split('/path/to/binary arg1 arg2'),
stderr=subprocess.STDOUT)
对于在范围(60)内的情况:#最多等待60秒
如果p.poll()不是无:
中断#过程已完成
其他:
时间。睡眠(1.0)#给它更多的时间
如果p.poll()为None:#时间到了,我们结束了吗?
尝试:
p、 杀死
除:
提升
raise RUNTIMERROR('二进制文件未能及时完成')

对于运行Python 2的用户,
超时=
关键字在
子流程中不可用。请检查输出

我能够通过使用
subprocess.Popen
获得所需的效果,它会立即返回:

导入子流程
import shlex#用于拆分子流程的参数
导入时间
p=subprocess.Popen(shlex.split('/path/to/binary arg1 arg2'),
stderr=subprocess.STDOUT)
对于在范围(60)内的情况:#最多等待60秒
如果p.poll()不是无:
中断#过程已完成
其他:
时间。睡眠(1.0)#给它更多的时间
如果p.poll()为None:#时间到了,我们结束了吗?
尝试:
p、 杀死
除:
提升
raise RUNTIMERROR('二进制文件未能及时完成')

谢谢您的快速回答。我正在运行Python2,其中
subprocess
缺少
timeout=
关键字,但我能够在下面的答案中获得与代码相同的效果。这是一个具体实现的细节,所以我将此答案标记为正确答案。感谢您的快速回答。我正在运行Python2,其中
subprocess
缺少
timeout=
关键字,但我能够在下面的答案中获得与代码相同的效果。这是一个具体实现的细节,所以我将这个答案标记为正确答案。