通过高权重网站做长尾关键词,嘉兴市城乡规划建设局网站,广东东莞十大特产,wordpress自己写代码1.Celery介绍
1.1 Celery是什么#xff1f;
Celery是Python开发的简单、灵活可靠的、处理大量消息的分布式任务调度模块专注于实时处理的异步任务队列同时也支持任务调度
Celery本身不含消息服务#xff0c;它使用第三方消息服务来传递任务#xff0c;目前#xff0c;Ce…1.Celery介绍
1.1 Celery是什么
Celery是Python开发的简单、灵活可靠的、处理大量消息的分布式任务调度模块专注于实时处理的异步任务队列同时也支持任务调度
Celery本身不含消息服务它使用第三方消息服务来传递任务目前Celery支持的消息服务有RabbitMQ、Redis、Amazon SQSCelery 是用 Python 编写的但协议可以用任何语言实现。除了 Python 语言实现之外还有Node.js的 node-celery 和php的 celery-php 。
需要注意的是 Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform. 大概意思就是Celery 是一个资金最少的项目因此我们不支持 Microsoft Windows请不要提出与该平台相关的任何问题。官方不支持windows可以通过插件eventlet在windows中使用功能有部分缩减。 1.2 架构图
Celery的架构由三部分组成消息中间件message broker、任务执行单元worker和 任务执行结果存储task result store组成。
启动celery服务配置好broker和backend手动或自动添加任务到broker中broker将任务分发给workerworker后台异步执行任务执行完成后将结果存放到backend中。 2.安装
2.1 linux安装
通过pip安装
# 本机Python环境为Python3.7.4
pip install celery# 验证安装 查看版本
celery --version---console---
5.2.3 (dawn-chorus)使用redis作为backend和broker需要本机安装redis并启动redis-server还需要安装Python第三方模块redis
pip install redis2.2 windows安装
由于官方不支持windows安装和使用需要借助Python第三方模块eventlet此模块主要作用通过协程实现并发。
pip install celery
pip install eventlet# 验证安装 查看版本
celery --version---console---
5.2.3 (dawn-chorus)3.基本使用
目录结构 celery对目录要求严格如果不在目录下加入__init__.pyworker执行任务可能会出现NotRegistered的情况
demo1- __init__.py- tasks.py- run.pytasks.py
from celery import Celery# 通过使用本机redis且没有密码使用远程redis有密码格式为
# redis://:密码ip:6379/1
broker redis://127.0.0.1:6379/1 # 任务储存
backend redis://127.0.0.1:6379/2 # 结果存储执行完之后结果放在这# 创建出app对象
app Celery(__name__, brokerbroker, backendbackend)# 任务通过装饰器app.task进行装饰
app.task
def add(x, y):return x yrun.py
from tasks import add# 添加任务# 返回一个 AsyncResult 实例可以用于进行跟踪任务状况
result add.delay(3,4)
print(result)3.1 启动worker
# 需要cd到tasks文件对应的路径
# 启动一个worker日志打印级别为info# windows平台启动
# celery -A tasks worker -l info -P eventlet
# linux启动
# 格式为celery -A app对象所在的文件 worker -l 日志级别
celery -A tasks worker -l info---console---
/usr/local/lib/python3.7/site-packages/celery/platforms.py:841: SecurityWarning: Youre running the worker with superuser privileges: this is
absolutely not recommended!Please specify a different user using the --uid option.User information: uid0 euid0 gid0 egid0uiduid, euideuid, gidgid, egidegid,-------------- celery6ae5fd398c10 v5.2.3 (dawn-chorus)
--- ***** -----
-- ******* ---- Linux-3.10.0-1160.59.1.el7.x86_64-x86_64-with-debian-9.11 2022-03-31 02:52:29
- *** --- * ---
- ** ---------- [config]
- ** ---------- . app: tasks:0x7f00470ca550
- ** ---------- . transport: redis://:**127.0.0.1:6379/1
- ** ---------- . results: redis://:**127.0.0.1:6379/2
- *** --- * --- . concurrency: 1 (prefork)
-- ******* ---- . task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- -------------- [queues]. celery exchangecelery(direct) keycelery[tasks]. tasks.add[2022-03-31 02:52:29,388: INFO/MainProcess] Connected to redis://:**127.0.0.1:6379/1
[2022-03-31 02:52:29,391: INFO/MainProcess] mingle: searching for neighbors
[2022-03-31 02:52:30,497: INFO/MainProcess] mingle: sync with 4 nodes
[2022-03-31 02:52:30,497: INFO/MainProcess] mingle: sync complete
[2022-03-31 02:52:30,511: INFO/MainProcess] celery6ae5fd398c10 ready.# 从控制台中可以看到一些celery的一些配置信息和运行信息3.2 添加任务
# 需要cd到run.py同路径且需要新打开一个bash窗口
python run.py
459b9b9f-de0e-4caf-bd23-f49ef89c797c
---console---# 此时查看worker所在的bash窗口窗口打印出了新的log信息
---console---
[2022-03-31 03:20:09,985: INFO/MainProcess] Task tasks.add[459b9b9f-de0e-4caf-bd23-f49ef89c797c] received
[2022-03-31 03:20:10,011: INFO/ForkPoolWorker-1] Task tasks.add[459b9b9f-de0e-4caf-bd23-f49ef89c797c] succeeded in 0.02414786597364582s: 7
连接redis查看结果存储
[rootcentos-01 demo1]# redis-cli127.0.0.1:6379 select 2
OK
127.0.0.1:6379[2] keys *
1) celery-task-meta-459b9b9f-de0e-4caf-bd23-f49ef89c797c
127.0.0.1:6379[2] get celery-task-meta-459b9b9f-de0e-4caf-bd23-f49ef89c797c
{\status\: \SUCCESS\, \result\: 7, \traceback\: null, \children\: [], \date_done\: \2022-03-31T03:20:09.987307\, \task_id\: \459b9b9f-de0e-4caf-bd23-f49ef89c797c\}
127.0.0.1:6379[2] # celery中backend使用的库为2切换到对应的库中查看所有的key发现只有一个key且key中包含AsyncResult 实例查看该key
# 对应的value正是我们执行的一些信息3.4 扩展
在run.py中添加
# 查看任务执行状态执行完成不管是否发生异常还是正常执行返回True未执行返回False
print(result.ready())# 如果任务出现异常可以通过以下命令进行回溯
result.tracebackfrom tasks import app
from celery.result import AsyncResultasy AsyncResult(idresult, appapp)
# 是否正常执行完成,正常执行成功返回True否则返回False
print(asy.successful())# 执行成功打印结果
print(asy.get())# 是否正常执行失败,失败返回True否则返回False
print(asy.failed())
# 查看任务状态
print(asy.status)
# 执行状态一般有三种PENDING、RETRY、STARTED
3.3 停止worker
直接通过Ctrl C停止即可