You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Worker终止当前任务执行并跳转至下一个任务?

解决Symfony Process执行外部脚本超时后无法立即终止的问题

核心原因

你遇到的问题是Symfony Process组件默认的超时仅标记任务状态,不会主动强制杀死子进程,导致Worker虽然标记任务失败,但仍需等待Python脚本自然结束才能继续下一个任务。以下是具体解决方法:

1. 在超时触发时强制终止子进程

使用Process的stop()方法,配合SIGKILL信号直接杀死子进程,确保立即停止执行:

use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessTimedOutException;

$process = new Process(['python', 'your_whois_script.py']);
$process->setTimeout(2); // 设置2秒超时阈值

try {
    $process->run();
} catch (ProcessTimedOutException $e) {
    // 立即强制终止子进程(0秒等待,发送SIGKILL信号)
    $process->stop(0, SIGKILL);
    // 直接返回,让Worker跳转至下一个任务
    return;
}
  • SIGKILL是最彻底的终止信号,会直接终止进程,避免Python脚本忽略SIGTERM默认信号。

2. 给Python脚本添加信号处理逻辑

确保Python脚本能响应终止信号,避免进程僵死:

import signal
import sys
import whois

def handle_termination(signum, frame):
    # 收到终止信号时立即退出
    sys.exit(1)

# 注册信号监听
signal.signal(signal.SIGTERM, handle_termination)
signal.signal(signal.SIGINT, handle_termination)

# 执行WHOIS请求
try:
    result = whois.whois('target-domain.com')
    print(result)
except Exception as e:
    print(str(e))
    sys.exit(1)

3. 兜底方案:Worker进程隔离

如果以上方法仍无效,可在Worker层面配置任务超时后重启Worker进程(比如用Symfony Messenger的max_execution_time配置),通过重启进程彻底清理僵死的子进程。

内容的提问来源于stack exchange,提问作者NicolasSC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:21:36