MainProcess Process ‘ForkPoolWorker-84‘ pid:31087 exited with ‘signal 9 (SIGKILL)‘

这篇博客探讨了在Flask中使用Celery时遇到的任务超时问题。当硬时间限制(hard_time_limit)设置为300秒,软时间限制(soft_time_limit)设为150秒时,日志仍然显示任务超过了硬时间限制。原因是Celery在软时间限制到达后不会立即终止任务,而是给予额外的时间让任务优雅地结束。为了解决这个问题,建议调整soft_time_limit小于hard_time_limit,并确保任务内部包含异常捕获来处理可能的长时间运行情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flask + celery

原因

此报错是因为celery任务超过了 hard_time_limit 时间被celery主进程kill掉了, 应该还能找到此报错: MainProcess Hard time limit (300s) exceeded for (此处设置的hard_time_limit为300s)

解决

把soft_time_limit设置少于hard_time_limit, 并进行异常捕获处理即可

存在问题

  • 查到公司原代码hard_time_limit为300s soft_time_limit为150s, 但日志仍然有MainProcess Hard time limit, 为什么在150s时没有抛异常, 进程可以执行300s最后被kill??
  • celery设置了soft_time_limit 还需要设置hard_time_limit么?
  • 什么情况会导致任务超过soft_time_limit 达到har_time_limit限制???
### Linux 中 `kill -9` 返回值 137 的含义 在 Linux 系统中,当一个进程被强制终止时,其退出码通常会反映具体的终止原因。具体到 `kill -9` 或者发送 SIGKILL 信号的情况,返回值 137 表明该进程因接收到编号为 9 的信号而被迫结束[^1]。 #### 数学计算解释 退出码的数值可以通过以下方式理解: - 当进程因为接收到了某个信号而异常终止时,系统的惯例是将信号编号加上 128 后作为退出状态码返回给父进程。 - 对于 SIGKILL(信号编号为 9),最终的退出码即为 \( 128 + 9 = 137 \)[^1]。 这种编码机制允许调用方区分正常退出与由于外部信号引发的非自愿终止情况。 #### 关于超出范围的状态码处理 值得注意的是,在某些情况下可能会遇到看似不符合常规定义的大数值退出码。然而依据标准规定,任何超过 255 的退出状态都会通过取模运算压缩至合法区间内[^3]。例如尝试设定 exit 参数为负数如 `-1` 实际上会被映射成正整数形式的最大可能值——也就是 255[^4]。 以下是验证上述理论的一个简单 Python 脚本实例: ```python import os import sys try: pid = os.fork() except OSError as e: print(f"Fork failed: {e}") sys.exit(1) if pid == 0: # 子进程 try: while True: pass except KeyboardInterrupt: sys.exit(137) # Simulate receiving signal 9 by exiting with code 137. else: # 父进程 _, status = os.waitpid(pid, 0) if os.WIFSIGNALED(status): signum = os.WTERMSIG(status) print(f"Child process was terminated by signal {signum}.") elif os.WIFEXITED(status): exit_code = os.WEXITSTATUS(status) print(f"Child exited normally with code {exit_code}.") ``` 此代码片段展示了如何创建子进程并模拟特定条件下的退出行为,同时捕获相应的退出信息以便进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值