知行迭代
导航
首页
最近更改
随机页面
常用
分类目录
Linux命令
Mediawiki常用
电脑技巧
工具
链入页面
相关更改
特殊页面
页面信息
登录
查看“Celery”的源代码
←
Celery
页面
讨论
阅读
查看源代码
查看历史
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:[
[1]
]
您可以查看和复制此页面的源代码。
Celery是基于[[Python]]的一个开源的分布式实时任务队列工具,同时也支持任务调度。 ==简介== ===时间轴=== *2009年04月24日,Ask Solem 发布Celery 0.1.0 *2010年02月10日,发布Celery 1.0.0 *2016年11月04日,发布Celery 4.0.0。配置文件引入小写字母设置和重命名了一些前缀。 *2020年09月24日,发布Celery 5.0.0 *2021年06月18日,发布Celery 5.1 {{了解更多 |[https://docs.celeryproject.org/en/master/history/index.html Celery 文档:历史]}} ===安装=== 使用[[pip]]安装: pip install -U Celery ==入门== ===基本架构=== Celery架构是一种生产者消费者模型,生产者(调用异步任务或定时任务)将任务发送到消息中间件([[Redis]]或[[RabbitMQ]]等),消费者(任务执行单元)从消息中间件读取执行。 {{#drawio:celery架构}} ===基本概念=== {| class="wikitable" style="width: 100%; ! 名称 ! 描述 |- | | |- | | |} ===示例 === == 异步任务 == == 定时任务 == Celery也支持定时任务,即周期性任务(Periodic Tasks)。celery beat定期发布任务,然后由celery worker执行。 {{了解更多 |[https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html Celery 文档:周期性任务] }} === 定时 === <code>schedule</code>用于设置执行的频率,可以是整数、timedelta、crontab、solar或自定义类型。一个示例: <syntaxhighlight lang="python"> from celery.schedules import crontab beat_schedule = { # 每个周星期一早上7点30分执行 'add-every-monday-morning': { 'task': 'tasks.task1', 'schedule': crontab(hour=7, minute=30, day_of_week=1), 'args': (16, 16), }, } </syntaxhighlight> {| class="wikitable" style="width: 100%; ! 类别 ! 描述 ! 示例 |- | 数字 | 表示秒 | <code>30.0</code> 每30秒执行一次 |- | [https://docs.python.org/dev/library/datetime.html#datetime.timedelta timedelta] | [[Python]]的timedelta对象,用于表示时间间隔。<br />使用时需要导入timedelta:<code>from datetime import timedelta</code> | <code>timedelta(seconds=30)</code> 每30秒执行一次 |- | [https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html#crontab-schedules crontab] | 能够方便设置每天或每星期什么时间执行。<br />使用时需要导入crontab:<code>from celery.schedules import crontab</code> | <code>crontab()</code> 每分钟执行 <br /><code>crontab(minute=0, hour=0)</code> 每天0点0分执行<br /><code>crontab(hour=7, minute=30, day_of_week=1)</code> 每个周星期一早上7点30分执行 <br /><code>crontab(minute=0, hour='*/6')</code> 每六个小时执行一次:午夜、早上 6 点、中午、下午 6 点 <br /><code>crontab(minute=0, hour='0,6,12,18')</code>同前面 |- | [https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html#solar-schedules solar] | 太阳时间表,按照日出、日落、黎明或黄昏来执行。<br />使用时需要导入solar:<code>from celery.schedules import solar</code> <br />格式:<code>solar(event, latitude, longitude)</code> | <code>'schedule': solar('sunset', -37.81753, 144.96715)</code> 墨尔本日落时执行 |- | 自定义 | | |} === 启动 === 启动celery beat服务: celery -A your_proj beat 通过-B,也可在启动celery worker服务时,同时启动celery beat服务。这种简单方便,但只适用于单个worker节点,因此不建议用于生产用途: celery -A your_proj worker -B {{了解更多 |[https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html#starting-the-scheduler Celery 文档:周期性任务 - 启动调度器] }} == 配置 == === 概览 === 配置一般写在单独的文件中。如果使用默认加载器,文件名称需要为celeryconfig.py。Celery 4.0 版引入了小写设置和重命名一些前缀,旧的配置命令将在Celery 6.0不可用。一个简单的配置文件: <syntaxhighlight lang="python"> # celery_task为项目目录,包含__init__.py、celeryconfig.py、task1.py、task2.py # celery_task # ├── __init__.py # ├── celeryconfig.py # ├── task1.py # └── task2.py # 以下为celeryconfig.py文件内容: # 任务队列设置 broker_url = 'redis://127.0.0.1:6379' # 任务转态和结果存储设置 result_backend = 'redis://127.0.0.1:6379/0' # 指定时区,默认是 UTC timezone = 'Asia/Shanghai' # 导入任务模块 imports = ( 'celery_task.task1', 'celery_task.task2' ) </syntaxhighlight> {{了解更多 |[https://docs.celeryproject.org/en/stable/userguide/configuration.html Celery 文档:配置和默认值] }} === Broker === {| class="wikitable" style="width: 100%; ! 名称 ! 描述 ! 示例 |- | [https://docs.celeryproject.org/en/stable/userguide/configuration.html#broker-url broker_url] | 默认消息队列URL。格式:<br /><code>transport://userid:password@hostname:port/virtual_host</code> <br />transport默认为<code>amqp://</code>,其他可选<code>redis://</code>、<code>sqs://</code>和<code>qpid://</code>。 | <code><nowiki>broker_url = 'redis://127.0.0.1:6379'</nowiki></code>使用redis作为消息队列。 |- | | | |} === 日期时间 === {| class="wikitable" style="width: 100%; ! 名称 ! 描述 ! 示例 |- | enable_utc | | |- | [https://docs.celeryproject.org/en/stable/userguide/configuration.html#timezone timezone] | 时区,默认"UTC" | |} === 结果存储 === == 监控和管理 == === 概览 === Celery几个常用监控管理工具: {| class="wikitable" style="width: 100%; ! 名称 ! 描述 |- | 命令 | |- | [https://flower.readthedocs.io/ Flower] | Flower是Celery的实时网络监控和管理工具。 <br /><br />使用:<br /><syntaxhighlight lang="bash"> # 安装flower pip install flower # 为celery项目启动一个网络服务器,默认端口5555,http://localhost:5555/ celery -A celery项目 flower # 浏览器访问flower,http://localhost:5555/ </syntaxhighlight> |- | celery events | 一个简单监视管理工具,在 Celery 2.0 版本新增。可以显示任务和worker的历史,以及查看任务的结果和追溯,它还支持一些管理命令,如限制速度和关闭worker。 <br /><br />使用:<br /><code>celery -A celery项目 events</code> |} {{了解更多 |[https://docs.celeryproject.org/en/stable/userguide/monitoring.html Celery 文档:监控和管理] }} ===Flower=== ====docker==== 使用docker compose可以快速搭建Flower测试环境,[https://github.com/mher/flower/blob/master/docker-compose.yml flower]官方有配置好的Celery + Flower + [[Redis]] + [[prometheus]] + [[grafana]]测试环境。 以下配置Celery + Flower + [[Redis]]环境。 项目结构: <syntaxhighlight lang="bash" > examples ├── docker-compose.yml ├── Dockerfile └── examples ├── celeryconfig.py └── tasks.py </syntaxhighlight> {{了解更多 |[https://github.com/mher/flower/blob/master/docker-compose.yml Github.com/mher/flower/:docker-compose.yml] }} ==Docker== ===celery=== 使用docker可以快速搭建环境,如搭建一个简单测试环境celery + [[redis]],项目目录如下: <syntaxhighlight lang="bash" > example ├── docker-compose.yml ├── Dockerfile └── tasks.py </syntaxhighlight> tasks.py用于配置Celery,注册异步函数 <syntaxhighlight lang="python" > from celery import Celery app = Celery('tasks', broker='redis://redis:6379/0', backend='redis://redis:6379/0' ) # 设置定时任务,每隔30秒执行一次add任务 app.conf.beat_schedule = { 'add-every-30-seconds': { 'task': 'tasks.add', 'schedule': 30.0, 'args': (16, 16) }, } # 注册异步任务 @app.task def add(x, y): return x + y </syntaxhighlight> Dockerfile是用于构建celery镜像,redis镜像直接使用官方。 <syntaxhighlight lang="Dockerfile" > FROM python:alpine # 安装celery和redis客户端 RUN pip install --no-cache-dir redis celery WORKDIR /data CMD ["celery"] </syntaxhighlight> docker compose组合管理容器 <syntaxhighlight lang="docker" > version: '3' services: redis: image: redis:alpine ports: - 6379:6379 worker: build: ./ entrypoint: celery command: -A tasks worker -l info -E user: nobody volumes: - ./:/data depends_on: - redis </syntaxhighlight> 终端进入项目目录,使用<code>docker compose up</code>即可启动celery和redis服务,另开一个终端,使用<code>docker exec -it celery容器名称 python</code>命令进入容器并运行Python,调用add异步函数测试: <syntaxhighlight lang="python" > from tasks import add add.delay(3,3) </syntaxhighlight> 定时任务需要启用celery beat,定时发送到任务队列。打开一个终端,使用<code>docker exec -it celery容器名称 celery -A tasks beat</code>命令使容器启动celery beat ===常见错误=== * docker-compose.yml中<code>build: ./ </code>时,如果Dockerfile中使用pip安装,可能出现<code>Failed to establish a new connection: [Errno -3] Try again')':</code>错误。 将docker-compose.yml中<code>build: ./ </code>修改为:<syntaxhighlight lang="docker" > build: context: ./ network: host </syntaxhighlight> ==资源== ===官网=== *Celery 官网: https://docs.celeryproject.org/ *Celery 文档: https://docs.celeryproject.org/ *Celery 下载:https://pypi.org/project/celery/ *Celery 源代码:https://github.com/celery/celery ===相关教程=== *[https://wiki.jikexueyuan.com/project/explore-python/Third-Party-Modules/celery.html 极客学院wiki:Python 之旅 - Celery] *[https://www.celerycn.io/ celerycn.io:Celery 中文手册] *[http://www.pythondoc.com/flask-celery/index.html 在 Flask 中使用 Celery] *[https://blog.miguelgrinberg.com/post/using-celery-with-flask Miguel Grinberg:Using Celery With Flask] ===相关文章=== *[https://en.wikipedia.org/wiki/Celery_(software) Wikipedia:Celery]
本页使用的模板:
模板:了解更多
(
查看源代码
)
返回至“
Celery
”。