1、介绍
有几种工具可用来监视和检查 Celery 集群。
本文将介绍其中的一些功能,以及与监视相关的特性,比如事件和广播命令。
- Workers
命令行实用工具
celery 还可以用来检查和管理工作节点和某种程度上的任务。列出所有可用的命令
$ celery help
或列出具体命令的帮助信息
$ celery <command> --help
命令
- shell : 进入含有celery变量的Python解释器环境,celery变量有 当前的celery app,tasks也会自动加入,除非设置了--without-tasks 标志被设置
$ celery -A myCeleryProj.app shell
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> locals().keys()
dict_keys(['app', 'celery', 'Task', 'chord', 'group', 'chain', 'chunks', 'xmap', 'xstarmap', 'subtask', 'signature', 'add', 'taskB', 'taskA', '__builtins__'])
>>> app
<Celery myCeleryProj at 0x1c5fe6a47b8>
>>> add
<@task: myCeleryProj.tasks.add of myCeleryProj at 0x1c5fe6a47b8>
>>> taskB.delay()
<AsyncResult: 914698c7-082f-4771-93b6-c6479f89c417>
>>>
- status 在这个集群中列出激活的节点
$ celery -A proj status
- result 显示任务的执行结果
$ celery -A proj result -t tasks.add 4e196aa4-0141-4601-8138-7aa33db0f577
注意,只要任务不使用自定义结果后端存储结果,使用时就可以省略任务的名称。
- purge 从所有配置的任务队列清除消息。这个命令将从配置的任务队列中清除所有的消息。此项操作不可撤销,消息将被永久清除。
$ celery -A proj purge
你可以指定要清除消息的队列
$ celery -A proj purge -Q celery,foo,bar
或排除指定的消息队列
$ celery -A proj purge -X celery
- inspect active 列出激活的任务。
$ celery -A proj inspect active
- inspect scheduled 列出计划任务
$ celery -A proj inspect scheduled
- inspect reserved 列出保留任务
celery -A proj inspect reserved
- inspect registered 列出已注册的任务
$ celery -A myCeleryProj.app inspect registered
-> celery@AARON: OK
* myCeleryProj.tasks.add
* myCeleryProj.tasks.taskA
* myCeleryProj.tasks.taskB
- 列出worker的统计信息。
$ celery -A myCeleryProj.app inspect stats
-> celery@AARON: OK
{
"broker": {
"alternates": [],
"connect_timeout": 4,
"failover_strategy": "round-robin",
"heartbeat": 120.0,
"hostname": "127.0.0.1",
"insist": false,
"login_method": null,
"port": 6379,
"ssl": false,
"transport": "redis",
"transport_options": {},
"uri_prefix": null,
"userid": null,
"virtual_host": "0"
},
"clock": "7905",
"pid": 7336,
"pool": {
"free-threads": 4,
"max-concurrency": 4,
"running-threads": 0
},
"prefetch_count": 16,
"rusage": "N/A",
"total": {
"myCeleryProj.tasks.add": 6,
"myCeleryProj.tasks.taskA": 5,
"myCeleryProj.tasks.taskB": 18
}
}
- inspect query_task: 通过 id 获取任务的信息。
$ celery -A myCeleryProj.app inspect query_task 898e9c89-d2ac-4a9c-aedc-2ff505ccab37
也可以一次查询多个任务
$ celery -A proj inspect query_task id1 id2 ... idN
- control enable_events: 启用/不启用事件。
celery -A proj control enable_events/disable_events
- migrate: 将任务由一个中间人转移至另一个中间人。
$ celery -A proj migrate redis://localhost amqp://localhost
这个命令将把一个中间人上的所有任务迁移到另一个中间人上。由于这个命令是新实验性的,在执行命令之前,确保对重要数据进行备份。
注意:inspect 和 control 命令默认对所有的 worker 生效,你可单独指定一个worker或一个worker的列表。命令如下所示:
$ celery -A proj inspect -d w1@e.com,w2@e.com reserved
$ celery -A proj control -d w1@e.com,w2@e.com enable_events
实时Celery的web 监控工具 - Flower
Flower是一个基于实时Web服务的Celery监控和管理工具。它正在积极开发中,但已经是一个必不可少的工具。作为Celery推荐的监视器,它淘汰了Django-Admin监视器、celerymon监视器和基于ncurses的监视器。
具有以下特色:
- 使用Celery事件来实时监控。
- 任务的进度和历史信息
- 可以查看任务的详情(参数,开始时间,运行时间等)
- 提供图表和统计信息
- 远程控制
- 查看worker的状态和统计信息
- 关闭和重启worker实例
- 控制worker的缓冲池大小和自动优化设置
- 查看并修改一个worker实例所指向的任务队列
- 查看目前正在运行的任务
- 查看定时或间隔性调度的任务
- 查看已保留和已撤销的任务
- 时间和速度限制
- 配置监视器
- 撤销或终止任务
- HTTP API
- 列出worker
- 关闭一个worker
- 重启worker的缓冲池
- 增加/减少/自动定量 worker的缓冲池
- 从任务队列消费(取出任务执行)
- 停止从任务队列消费
- 列出任务列表/任务类型
- 获取任务信息
- 执行一个任务
- 按名称执行任务
- 获得任务结果
- 改变工作的软硬时间限制
- 更改任务的速率限制
- 撤销一个任务
- OpenID 身份验证
截图
workers
monitor
使用方法
你可以使用 pip 安装 Flower
pip install flower
运行下面的 flower 命令你将得到一个可以访问的 web 服务器。
$ celery -A myCeleryProj.app flower
[I 180907 22:34:43 command:139] Visit me at http://localhost:5555
[I 180907 22:34:43 command:144] Broker: redis://127.0.0.1:6379/0
[I 180907 22:34:43 command:147] Registered tasks:
['celery.accumulate',
'celery.backend_cleanup',
'celery.chain',
'celery.chord',
'celery.chord_unlock',
'celery.chunks',
'celery.group',
'celery.map',
'celery.starmap',
'myCeleryProj.tasks.add',
'myCeleryProj.tasks.taskA',
'myCeleryProj.tasks.taskB']
[I 180907 22:34:43 mixins:224] Connected to redis://127.0.0.1:6379/0
从输出的信息可以看出,默认的端口为 http://localhost:5555,但你也可以手工指定端口,命令如下所示 :
$ celery -A myCeleryProj.app flower --port=5555
中间人的url也可以通过参数 --broker参数来指定
$ celery -A myCeleryProj.app flower --port=5555 --broker=redis://127.0.0.1:6379/0
打开浏览器 http://localhost:5555 可以看到flower的web界面
celery1.png
celery2.png
celery3.png
celery4.png
Flower 还有更多的功能,包括用户授权功能,更多详细信息请访问flower的官方文档
Redis
如果你使用 Redis做为中间人,为监控Celery 集群 ,你可以使用redis-cli命令来列出消息队列的长度,命令如下所示:
$ redis-cli -h HOST -p PORT -n DATABASE_NUMBER llen QUEUE_NAME
Celery 默认的队列名称为 celery,为得到所有键值信息,可以使用如下命令:
$ redis-cli -h HOST -p PORT -n DATABASE_NUMBER keys \*
如有需要请关注微信公众号 somenzz,回复 celery 下载源码。
作者:somenzz
链接:https://www.jianshu.com/p/ca4d93477abb
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
终止工作进程
直接control -c(按照上述命令在前台启动的),当然了如果在后台启动和停止:
celery multi start w1 -A proj -l info
celery multi restart w1 -A proj -l info
# 异步关闭 立即返回
celery multi stop w1 -A proj -l info
# 等待关闭操作完成
celery multi stopwait w1 -A proj -l info
默认会在当前目录下创建pid和log文件,指定路径和名称:
celery multi start w1 -A proj -l info --pidfile=/var/run/celery/%n.pid \
--logfile=/var/log/celery/%n%I.log
关于-A(--app)选项:
指定celery app,可以用 module.path:attribute的形式指定,也可直接指定package,如--app=proj,然后会搜索其中的proj.app,proj.celery等。
操作已被创建的worker时,不需要参数什么的完全一样,只要pidfile和logfile一样即可。
调用
add.delay(1, 1)
add.apply_async((1, 1))
add.apply_async((2, 2), queue='lopri', countdown=10)
# 指定要发送到哪个队列 运行时间延迟countdown
# 结果获得
res = add.delay(1, 1)
res.get()
celery默认不产生结果的原因:因为各种应用的需求不同,而大多数任务保存返回值没有什么意义,而且产生结果并不是用来监控任务和工作进程,应该是使用event消息的专门的监控模块。
res.id # 任务id uuid
# 任务出错会raise 错误 可指定propagate
res.get(propagate=False)
res.failed()
res.successful()
res.state
# PENDING -> STARTED -> SUCCESS(FAILURE)
# STARTED 需要设置 task_track_started 或在任务级别设置@task(track_started=True)
# 重试的情况也有
# PENDING -> STARTED -> RETRY -> STARTED -> RETRY -> STARTED -> SUCCESS
工作流
有时想把一个任务的签名(包含了实参和任务的执行选项)发送到另一个进程或把参数发送到另一个函数。
add.signature((2, 2), countdown=10) # with args and kwargs
add.s(2, 2) # with args only
然后获得的签名就可以调用:
s1 = add.s(2, 2)
res = s1.delay()
res.get()
# 也可以部分指定参数 然后在调用时补全参数
s2 = add.s(2)
res = s2.delay(8)
res.get()
调用方式
之前一直使用的是delay(*args, **kwargs)的方式来调用,还有apply_async的调用方式,支持一些执行时的选项
Groups
group是同时调用的一系列任务,返回特殊的结果可以获得组内所有的执行结果,可以按照任务的顺序从该结果中获得对应任务的结果。
group(add.s(i, i) for i in xrange(10))().get()
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 组也支持部分参数化
g = group(add.s(i) for i in xrange(10))
g(10).get()
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Chains
把任务连接起来,执行完一个后把结果传入另一个再调用。
chain(add.s(4, 4) | mul.s(8))().get()
g = chain(add.s(4) | mul.s(8))
g(4).get()
# 也支持部分参数化
chords
chord是一个带callback的group
from celery import chord
from proj.tasks import add, xsum
chord((add.s(i, i) for i in xrange(10)), xsum.s())().get()
# 而group的结果发送到另一个任务则自动转换为chord
(group(add.s(i, i) for i in xrange(10)) | xsum.s())().get()
# 可以把单任务的结果发送到组中
upload_doc.s(file) | group(apply_filter.s() for filter in filters)
Routing
在app层面配置task到某个队列:
app.conf.update(
task_routes = {
'proj.tasks.add': {'queue': 'hipri'},
},
)
在调用时指定使用某个队列:
add.apply_async((2, 2), queue='hipri')
启动工作进程时指定该进程处理的队列:
celery -A proj worker -Q hipri
# 指定多个处理的队列 默认队列名称:celery
celery -A proj worker -Q hipri,celery
远程控制
查看工作进程当前的工作:
celery -A proj inspect active
这个命令是一个广播,所有工作进程都会收到。(需要启用event)
celery -A proj inspect active --destination=celery@example.com
让工作进程启用event
celery -A proj control enable_events
作者:xncode
链接:https://www.jianshu.com/p/92ee2beb10f6
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。