celery,实现了异步的分布式任务队列。中间是两个队列,左边是执行任务,将任务提交到中间的队列中,右边是worker,能自动发现队列中的任务。左边调用任务,右边worker就会拿到这个任务运行,并且是异步运行,运行的结果会放到结果队列中,如果需要,调用任务的程序能拿到这个结果。这就是分布式任务队列,它跟我们的项目是分开的,是独立运行的。
选择一个broker,就是选择一个消息队列,可以使用rabbimq,redis或者是其它。我们这里的任务队列和任务结果队列都用redis作为broker
当客户端发起任务到服务端,服务的django接收到任务之后,比如前端登录时发送短信,服务端调用程序给短信接口发送请求,发送短信给客户并接收响应信息,这种情况就可以用celery去做成异步的任务,我们也可以用协程去做。
安装
pip install -U celery
Celery 官网:Celery - Distributed Task Queue — Celery 5.2.7 documentation
Celery 官方文档英文版:Celery - Distributed Task Queue — Celery 5.3.0b1 documentation
Celery 官方文档中文版:Celery - 分布式任务队列 — Celery 3.1.7 文档
Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统
应用¶
首先你需要一个 Celery 实例,称为 Celery 应用或直接简称应用。既然这个实例用于你想在 Celery 中做一切事——比如创建任务、管理职程——的入口点,它必须可以被其他模块导入。
在此教程中,你的一切都容纳在单一模块里,对于更大的项目,你会想创建 独立模块 。
让我们创建 tasks.py :
from celery import Celery app = Celery('tasks', broker='amqp://guest@localhost//') @app.task def add(x, y): return x + y
Celery 的第一个参数是当前模块的名称,这个参数是必须的,这样的话名称可以自动生成。第二个参数是中间人关键字参数,指定你所使用的消息中间人的 URL,此处使用了 RabbitMQ,也是默认的选项。更多可选的中间人见上面的 选择中间人 一节。例如,对于 RabbitMQ 你可以写 amqp://localhost ,而对于 Redis 你可以写 redis://localhost .
你定义了一个单一任务,称为 add ,返回两个数字的和。
根据情况我们创建如下的目录结构
我们在主程序中创建app,需要指定broker等参数。我们可以如下方式去配置。我们也可以写一个config文件,然后导入配置
我们可以先配置一下borker地址
# 任务队列的链接地址(变量名必须叫这个) broker_url = 'redis://127.0.0.1:6379/14' # 结果队列的链接地址(变量名必须叫这个) result_backend = 'redis://127.0.0.1:6379/15'
我们在主程序中创建celery对象,然后根据配置文件导入配置
接下来就是写任务了。我们创建一个包,并创建一个文件,文件名得是tasks
看下官网是如何写的,是在任务函数上面添加celery的装饰器,跟flask视图函数装饰器的使用差不多。
我们将创建的celery对象app导入,然后在tasks文件中写任务函数,并用app.task作为装饰器给任务函数使用。task后面不用加括号
我们如何去发现我们写的任务呢,我们在主程序中调用自动发现任务的方法,指定任务的路径。任务的路径就写到tasks文件的目录就可以,它就会自动找到这个目录下对应的tasks文件中app.task装饰的函数。
运行celery,到celery的外层目录执行命令
celery -A mycelery.main worker --loglevel=info (或者直接写info也行) #-A是指定celery启动入口
-A 指定是mycelery下的main文件文件启动,使用worker来启动,
需要修改一下
任务要放到列表里面
我们可以看到。任务成功运行,看到配置信息,8个并发
还可以看到任务函数名称,
标签:Celery,tasks,队列,app,celery,任务 From: https://www.cnblogs.com/machangwei-8/p/17149995.html