资讯专栏INFORMATION COLUMN

celery 使用

GraphQuery / 2618人阅读

摘要:使用消息来通信,流程为客户端添加消息到队列来初始化一个任务,然后消息队列系统把消息分发给工作进程。可以包含多个工作进程和消息系统,来保证高可用性和进行水平扩展。保存结果可以使用很多例如的,,。

celery是一个简单的、灵活的、可靠的分布式系统,提供了工具来维护这样一个系统,用于处理大量的信息(实时信息、定时任务安排),是一个任务队列,易于使用,易于和其他语言进行配合。

任务队列

任务队列是一种把任务通过线程或机器进行分发的机制,输入是一个工作单元--任务,工作进程则不断地检查任务队列来执行新任务。celery使用消息来通信,流程为:客户端添加消息到队列来初始化一个任务,然后消息队列系统把消息分发给工作进程。celery可以包含多个工作进程和消息系统,来保证高可用性和进行水平扩展。

特性

简单,不需要配置文件,高可靠性(工作进程和客户端在连接丢失或失败时会自动重试,一些支持HA的消息系统可以做主主、主从扩展),快速(每分钟处理几百万任务,通过使用RabbitMQ librabbitmq 和 一些优化设置),它的每一部分都可以灵活地扩展(自定义的pool,序列化方式,压缩,日志,周期任务,消费者,生产者),支持的消息队列系统(redis rabbitmq),支持的结果存储(django sqlalchemy redis amqp),并发支持(多进程,eventlet gevent,单线程),序列化方式(json pickle yaml msgpack)。

自带的监控功能,工作流,资源泄露预防,处理速率、运行时间控制

消息队列

rabbitmq 功能完整、稳定、耐用、易安装,作为生产环境很合适。

redis 也是功能完整的,但是丢失数据的可能性较高,如被停止或停电。

应用

需要一个celery实例,即应用。这个应用是使用所有东西的进入点,例如创建任务、管理工作进程,必须可被其他模块引入。

tasks.py

# coding: utf8
from celery import Celery

app = Celery("tasks", broker="pyamqp://guest@localhost//")
# 传入的tasks参数即当前的模块名称,broker即为消息队列的地址
# ampb(RabbitMQ) redis

# 下面创建任务
@app.task
def add(x, y):
    return x + y

执行程序,启动服务器:

celery -A tasks worker --loglevel=info
调用
from tasks import add
add.delay(4, 4)

现在task是被之前启动的工作进程来执行,返回值是一个AsyncResult,可以用来判断任务的状态、等待该任务执行完毕或是获得它的返回值。默认是不返回的,需要配置result backend,也可以在工作进程的命令行输出窗口中看到。

保存结果

可以使用很多backend 例如Django的ORM、SQLAlchemy,Redis,RabbitMQ。

app = Celery("tasks", backend="rpc://", broker="pyamqp://")
# 这边使用的backend是RabbitMQ的rpc远程调用

result = add.delay(4, 4)  # 现在就可以获得返回的result了
result.ready()  # 判断任务是否执行完成
result.get(timeout=1)  # 等待任务执行(一般不用)
# 如果任务出错了这边也会直接获得异常 或:
result.get(propagate=False)  # 不抛出
result.traceback  # 再获得异常信息
配置
app.conf.task_serializer = "json"
# 设置task的序列化方式

# 一次设置很多选项
app.conf.update(
    task_serializer="json",
    accept_content=["json"],
    result_serializer="json",
)    

使用配置模块:

app.config_from_object("celeryconfig")

celeryconfig.py

broke_url = "pyamqp://"
task_serializer = "json"
task_serializer = "json"
result_serializer = "json"
accept_content = ["json"]
timezone = "Europe/Oslo"
enable_utc = True

如果想测试配置文件是否有语法问题,和普通的py文件一样,使用:

python -m celeryconfig

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38511.html

相关文章

  • 异步任务神器 Celery 简明笔记

    摘要:我们将窗口切换到的启动窗口,会看到多了两条日志这说明任务已经被调度并执行成功。本文标题为异步任务神器简明笔记本文链接为参考资料使用之美分布式任务队列的介绍思诚之道异步任务神器简明笔记 Celery 在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用多线程或异步任务。比如,在 Web 开发中,对新用户的注册,我们通常会给他发一封激活邮件,...

    Ryan_Li 评论0 收藏0
  • Celery使用Flask的上下文

    摘要:所以这就现实了在中使用的应用上下文。要引入请求上下文,需要考虑这两个问题如何在中产生请求上下文。中有和可以产生请求上下文。具体的思路还是在中重载类,通过,在的上下文环境下执行。将他们传入,生成伪造的请求上下文可以覆盖大多数的使用情况。 其实我只是想把邮件发送这个动作移到Celery中执行。既然用到了Celery,那么每次发邮件都单独开一个线程似乎有点多余,异步任务还是交给Celery吧...

    Sourcelink 评论0 收藏0
  • django开发-使用celery搭建分布式(多节点)任务队列

    摘要:今天介绍一下如何在项目中使用搭建一个有两个节点的任务队列一个主节点一个子节点主节点发布任务,子节点收到任务并执行。 今天介绍一下如何在django项目中使用celery搭建一个有两个节点的任务队列(一个主节点一个子节点;主节点发布任务,子节点收到任务并执行。搭建3个或者以上的节点就类似了),使用到了celery,rabbitmq。这里不会单独介绍celery和rabbitmq中的知识了...

    ConardLi 评论0 收藏0
  • Celery任务队列

    摘要:文档中文文档官方文档定时服务与结合使用简介是一个自带电池的的任务队列。追踪任务在不同状态间的迁移,并检视返回值。 文档 中文文档 官方文档 celery定时服务、celery与django结合使用 简介 Celery 是一个自带电池的的任务队列。它易于使用,所以你可以无视其所解决问题的复杂程度而轻松入门。它遵照最佳实践设计,所以你的产品可以扩展,或与其他语言集成,并且它自带了在生产...

    Lorry_Lu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<