【译】Celery文档1:First Steps with Celery——安装和配置Celery

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,经济版 1GB 1个月
简介: 【译】Celery文档1:First Steps with Celery——安装和配置Celery

Celery的第一步

Celery时一个自带电池的任务队列

本教程内容:

  • 安装消息传输代理(broker)
  • 安装Celery并创建第一个任务(task)
  • 启动Celery工作进程(worker)并执行任务
  • 追踪任务的状态

选择Broker

Celery需要一个方法来发送和接受消息,这个方法被称为消息代理(message broker)。

Celery支持多种消息代理,如RabbitMQ、Redis等。

安装RabbitMQ

(推荐)在Dockers上运行RabbitMQ:

docker run -d -p 5672:5672 rabbitmq


或者在Ubuntu上安装RabbitMQ:

sudo apt-get install rabbitmq-server

运行Celery worker server

celery -A tasks worker --loglevel=INFO

Windows下有个坑:celery正常启动和接收任务但不能执行,报错:ValueError: not enough values to unpack (expected 3, got 0)。

需要借助eventlet:

1.安装eventlet: pip install eventlet

2.借助eventlet启动celery: celery -A tasks worker --loglevel=INFO -P eventlet

参考1:https://www.cnblogs.com/qumogu/p/13284173.html

参考2:https://stackoverflow.com/questions/37255548/how-to-run-celery-on-windows

但这只是一个临时解决方案, celery对windows的支持很差,最好还是在Linux下运行。windows系统可以用WSL。

调用task

使用delay()方法调用task:

在Python shell中:

from tasks import add
add.delay(4, 4)

注:delay()方法是apply_async()方法的快捷方式。

然后,之前启动的worker进程会执行这个任务。可以在worker进程的日志中看到任务的执行情况:

[2024-04-10 21:58:25,217: INFO/MainProcess] Task tasks.add[987d2e18-0090-4b5b-bcb5-bd038b9690a3] received
[2024-04-10 21:58:25,221: INFO/MainProcess] Task tasks.add[987d2e18-0090-4b5b-bcb5-bd038b9690a3] succeeded in 0.0s: 8   

保留结果

如果要跟踪任务的状态, Celery需要将状态存储或发送到某个地方,如SQLAlchemy/Django ORM、MongoDB、Memcached、Redis、RPC(RabbitMQ/AMQP),并且可以自定义。

在此示例中,我们使用 rpc作为结果后端(result backend),它将状态作为暂时性消息发送回。Celery通过 backend参数 指定后端(如果选择使用配置模块,则通过result_backend设置指定)。因此,您可以在 tasks.py 文件中修改此行以启用 rpc:// 后端:

app = Celery('tasks', backend='rpc://', broker='pyamqp://')

或者,如果您想使用 Redis 作为结果后端,但仍然使用 RabbitMQ 作为消息代理(一种流行的组合):

app = Celery('tasks', backend='redis://localhost', broker='pyamqp://')

现在配置了结果后端,关闭当前 python 会话并再次导入 tasks 模块以使更改生效。这一次,您将保留调用任务时返回的 AsyncResult 实例:

from tasks import add   
result = add.delay(4, 4)

然后可以用ready()方法检查任务是否完成:

result.ready()

您可以等待结果完成,但很少使用,因为这会将异步调用转换为同步调用:

result.get(timeout=1)
8

Configuration

Celery就像家用电器一样,不需要太多配置。 只需要配置输入(连接到代理 broker)和输出(连接到结果后端)即可使用。但是,如果你仔细观察,你会发现有很多按钮。这就是配置选项。

默认的配置通常是足够的,但是也可以通过修改配置让Celery更适合你的需求。

可以直接在app上修改配置:

app.conf.task_serializer = 'json'

如果一次性修改多个配置,可以使用update方法:

app.conf.update(
    task_serializer='json',
    accept_content=['json'],  # Ignore other content
    result_serializer='json',
    timezone='Europe/Oslo',
    enable_utc=True,
)

对于较大的项目,建议使用专用的配置模块。可以用app.config_from_object()告诉 Celery 使用配置模块:

app.config_from_object('celeryconfig')

配置模块名称通常是celeryconfig

该模块必须在当前目录可以访问,

celeryconfig.py:

broker_url = 'pyamqp://'
result_backend = 'rpc://'

task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'Europe/Oslo'
enable_utc = True

要验证配置文件是否正常工作且不包含任何语法错误,可以尝试导入它:

python -m celeryconfig

下面是两个配置示例:

将行为异常的任务路由到专用队列的方式

task_routes = {
    'tasks.add': 'low-priority',
}

对任务进行速率限制

task_annotations = {
    'tasks.add': {'rate_limit': '10/m'}
}

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
消息中间件 存储 前端开发
【译】Celery文档2:Next Steps——在项目中使用Celery
【译】Celery文档2:Next Steps——在项目中使用Celery
|
1月前
|
数据库 Python
【译】Celery文档3:在Django中使用Celery
【译】Celery文档3:在Django中使用Celery
|
2月前
|
监控 NoSQL 测试技术
python使用Flask,Redis和Celery的异步任务
python使用Flask,Redis和Celery的异步任务
|
11月前
|
消息中间件 开发框架 NoSQL
celery--介绍
celery--介绍
|
11月前
|
缓存 NoSQL Redis
celery--实现异步任务
celery--实现异步任务
|
NoSQL API 调度
Celery初探
Celery初探
212 0
|
消息中间件 存储 JSON
celery 源码解析 - 3
Celery是一款非常简单、灵活、可靠的分布式系统,可用于处理大量消息,并且提供了一整套操作此系统的工具。Celery 也是一款消息队列工具,可用于处理实时数据以及任务调度。
172 0
celery 源码解析 - 3
|
消息中间件 NoSQL Redis
celery 使用指南 - 1
Celery 通过消息机制进行通信,通常使用中间人(Broker)作为客户端和职程(Worker)调节。启动一个任务,客户端向消息队列发送一条消息,然后中间人(Broker)将消息传递给一个职程(Worker),最后由职程(Worker)进行执行中间人(Broker)分配的任务。
234 0
|
Python
django celery 异步执行任务遇到的坑
django celery 异步执行任务遇到的坑
|
消息中间件 API 调度
celery 常用执行命令
celery 常用执行命令详解