取消流程运行#
你可以从命令行界面(CLI)、用户界面(UI)、REST API或Python客户端取消计划中或正在进行的流程运行。
当请求取消时,流程运行会进入“正在取消”状态。如果部署是基于工作池的部署且有一个工作器,那么工作器会监控流程运行的状态并检测到有取消请求。然后,工作器向流程运行基础设施发送一个信号,请求终止运行。如果在宽限期后(默认30秒)运行仍未终止,则基础设施将被终止,确保流程运行退出。
需要部署
流程运行取消要求流程运行与部署相关联。必须运行监控过程以执行取消操作。
内嵌的嵌套流程运行(那些没有使用run_deployment
创建的),不能在不取消父流程运行的情况下被取消。为了独立于其父流程运行取消一个嵌套流程运行,我们建议将其单独部署并使用run_deployment函数启动它。
取消操作对Prefect工作器的重启具有弹性。
为了实现这一点,我们将关于创建的基础设施的元数据附加到流程运行上。
在内部,这被称为infrastructure_pid
或基础设施标识符。
通常,它由两部分组成:
范围:确定基础设施运行的位置。
ID:在范围内为基础设施的唯一标识符。
这个范围确保了Prefect不会错误地终止不相关的基础设施。 例如,运行在多台机器上的工人可能会有重叠的进程ID,但它们的范围不应该相同。
基础设施类型的标识符包括:
进程:机器主机名和PID。
Docker容器:Docker API URL和容器ID。
Kubernetes任务:Kubernetes集群名称和任务名称。
虽然取消过程是健壮的,但仍有一些可能的问题:
如果流程运行的基础设施不支持取消操作,则取消将无法进行。
如果尝试取消流程运行时,标识符的范围不匹配,工人无法取消流程运行。另一个工人可能会尝试取消。
如果与运行相关的基础设施找不到或已被终止,工人会将流程运行标记为已取消。
如果缺少
infrastructure_pid
,流程运行将被标记为已取消,但不能强制执行取消。如果工人在取消过程中遇到意外错误,根据错误发生的位置,流程运行可能被取消也可能不被取消。工人将再次尝试取消流程运行。另一个工人可能会尝试取消。
通过命令行接口(CLI)取消流程运行#
在您的执行环境中,可以通过使用 prefect flow-run cancel
CLI命令并传递流程运行的ID来取消一个流程运行。
prefect flow-run cancel 'a55a4804-9e3c-4042-8b59-b3b6b7618736'
通过用户界面(UI)取消#
导航到流程运行的详细页面,并在右上角点击“取消”按钮。
超时设置#
流程超时设置用于防止意外的长时运行流程。当流程的执行时间超过了设定的超时时间时,会触发一个超时异常,并且该流程会被标记为失败。在用户界面上,流程会被明显地标记为“超时”。
超时持续时间是通过 timeout_seconds
关键字参数来指定的。
from prefect import flow
import time
@flow(timeout_seconds=1, log_prints=True)
def show_timeouts():
print("I will execute")
time.sleep(5)
print("I will not execute")