python celery库踩坑汇总

news/2024/9/25 17:00:58/

一、TimeLimit&SoftTimeLimit 的坑

celery 中 time limit 有两种, soft_time_limit 和 time_limit, 区别是 soft_time_limit 会在内部抛一个 Exception, task 可以 通过try...except 自行处理,time_limit则是中断woker重启没法被catch做一些操作。

python">from myapp import app 
from celery.exceptions 
import SoftTimeLimitExceeded 
@app.task
def mytask():try:         do_work() except SoftTimeLimitExceeded:        clean_up_in_a_hurry()

经过本人反复实验, 只有celery pool 的默认模式prefork,同时支持上面两种超时处理,两种协程模式gevent和eventlet不支持soft_time_limit,最坑爹的solo模式怎么配置都毫无作用。

以下是 Celery 支持的一些常见并发模式:

  1. solo:默认模式,工作进程在单个进程中顺序执行任务。

  2. prefork:传统的 UNIX 方式,工作进程会创建多个子进程来并行执行任务。

  3. eventlet:基于 Eventlet 库,使用协程来实现并发。

  4. gevent:基于 Gevent 库,使用绿色线程来实现并发。

  5. threads:使用 Python 的标准库 threading 模块来创建一个线程池。

  6. processes:使用 Python 的 multiprocessing 模块来创建一个进程池。

  7. aiopg:使用异步进程池,基于 asynciomultiprocessing

解决方案

自己实现task的超时捕捉异常返回的操作。

python常用定义超时异常的方法有func-timeout库

也可以通过自定义装饰器,或者魔法模块contextlib来实现。

我这里具体任务是处理视频,根据视频长度不同来设置不同的超时是最优化的方案,因此我用contextlib来实现超时捕获

python">import signal
from contextlib import contextmanager
# 自定义超时异常
class TimeoutError(Exception):def __init__(self, msg):super(TimeoutError, self).__init__()self.msg = msg
​
@contextmanager
def timeout(interval):def _handler(signum,frame):raise TimeoutError(f"任务超时!")try:signal.signal(signal.SIGALRM,_handler)signal.alarm(interval)  # interval秒后向进程发送SIGALRM信号yield# except TimeoutError as e:#     raise TimeoutError(e)finally:signal.alarm(0)

使用时

python">try:with timeout(limit_time):dowork()
except TimeoutError as e:clean_up_in_a_hurry()

值得注意的是,该方法是python在linux下的超时,windows下不支持signal库需要用别的方法。

目前用下来celery的坑还是不少的(包括监控flower的时间的坑),执行效率其实也不咋地。


http://www.ppmy.cn/news/1530376.html

相关文章

vue3+element-plus icons图标选择组件封装

一、最终效果 二、参数配置 1、代码示例 <t-select-icon v-model"selectVlaue" />2、配置参数&#xff08;Attributes&#xff09;继承 el-input Attributes 参数说明类型默认值v-model绑定值string-prefixIcon输入框前缀iconstringSearchisShowSearch是否显…

Qt QVector类

Qt中的QVector是一个模板类&#xff0c;用于存储和操作动态数组。它类似于C标准库中的std::vector&#xff0c;但提供了更多的Qt特有的功能和便利性&#xff0c;更适合在Qt应用中使用。 创建和初始化 // 1&#xff09;默认构造函数&#xff1a;创建一个空的QVector对象。 QV…

云原生链路观测平台 openobserve + fluent-bit,日志收集

grpc-opentracing https://github.com/grpc-ecosystem/grpc-opentracing openobserve fluent-bit 为啥会选择这个组合 一个 rust 写的一个是c写的&#xff0c;性能和内存方面不用担心&#xff0c;比java 那套好太多了 openobserve 文档 &#xff1a;https://openobserve.ai/…

网安面试会问到的:http的长连接和短连接

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

浅谈医院配电系统谐波分析与治理技术方案

摘要&#xff1a;文章从谐波治理的危害、治理意义、谐波源组成、谐波治理等方面进行了论述。目的在于通过综合整治电网的谐波&#xff0c;有效地改善医院配电系统的安全、可靠、节能。 关键词&#xff1a;医院&#xff1b;配电系统&#xff1b;谐波治理 0引言 配电系统中存在…

1992-2022年各地级市夜间灯光数据(excel+shp格式)

1992-2022年各地级市夜间灯光数据&#xff08;excelshp格式&#xff09; 1、时间&#xff1a;1992-2022年 2、来源&#xff1a; DMSP-OLS、NPP-VIIRS 3、指标&#xff1a;均值、总和、最小值、最大值、标准差 4、范围&#xff1a;371个地级市 5、说明&#xff1a;夜间灯光…

计算机毕业设计之:宠物互助平台的微信小程序系统(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Prometheus 上手指南

文章目录 Prometheus 相关概念Prometheus 的特点Prometheus 架构数据模型 Datemode使用场景 指标类型 Metric type适用场景 作业和实例 Jobs and instances使用场景 Prometheus 安装Prometheus 配置prometheusalertmanager Grafana 可视化Grafana 安装Grafana 配置选项Grafana …