celery中API Reference(celery.app.control)

文章介绍了Celery框架中worker的远程控制命令,包括无副作用的Inspect命令和有副作用的Control命令。通过示例代码展示了如何使用这些命令进行任务的管理和监控,如ping、任务注册信息查询、任务报告、保留任务及撤销任务等操作。同时,文章提到了在Windows环境下启动Celeryworker的注意事项和多任务环境的配置。

官方文档:celery.app.control — Celery 5.2.7 documentation

worker远程控制命令的客户端。

服务器实现在celery.worker.control. 有两种类型的远程控制命令:

Inspect commands: 

        没有副作用,通常只会返回在 worker 中找到的一些值,如当前注册任务列表、活动任务列表等。命令可通过Inspect类访问。

Control commands:

        执行副作用,比如添加一个新的队列来消费。命令可通过Control类访问。

class celery.app.control.Control(app=None):

pass

创建一个多任务python环境

目录结构如下所示:

其中,tasks是消费者模块,有管理的celery文件,有多个任务函数文件。produce_task1模拟消费者,测试异步任务调用,produce_task2模拟定时任务调用。

celery启动

celery -A celery_demo2.tasks.celery worker --loglevel=info -P eventlet

注意:在windows中执行时,添加-P eventlet,否则可能报错。

Ping

ping(destination=None)

Ping 所有(或特定)worker。

destination ( List ) – 如果设置,则向所有worker广播时向其发送命令的主机列表。

celery启动,指定名称-n,这儿启动两个来演示:

celery -A celery_demo2.tasks.celery worker -n dgw_node1 --loglevel=info -P eventlet
celery -A celery_demo2.tasks.celery worker -n dgw_node2 --loglevel=info -P eventlet

示例代码:   【此时任务被两个worker都进行消费了】

from celery_demo2.tasks.task1 import send_email
from celery_demo2.tasks.task2 import send_msg
from celery_demo2.tasks.celery import app
from celery import current_app


result1 = send_email.delay('张三')
print(f"任务ID{result1.id}")
result2 = send_msg.delay('王五')
print(f"任务ID{result2.id}")
ret = app.control.ping()
print(ret)

ret2 = app.control.ping(destination=['celery@dgw_node1'])
print(ret2)

ret3 = app.control.ping(destination=['celery@dgw_node2'])
print(ret3)

print("*" * 100)

ret4 = app.control.inspect().ping()
print(ret4)

ret5 = app.control.inspect().ping(destination=['celery@dgw_node1'])
print(ret5)

print("*" * 100)

ret6 = current_app.control.ping()
print(ret6)

ret7 = current_app.control.ping(destination=['celery@dgw_node1'])
print(ret7)

print("*" * 100)

ret8 = current_app.control.inspect().ping()
print(ret8)

ret9 = current_app.control.inspect().ping(destination=['celery@dgw_node1'])
print(ret9)

ret10 = current_app.control.inspect().ping(destination=['celery@dgw_node2'])
print(ret10)

print("程序执行完毕!")

运行结果:

registered

registered(*taskinfoitems)

返回每个worker的所有注册任务。

taskinfoitems ( Sequence [ str ] ) –Task 要包含的属性列表。

启动celery两个worker。

示例代码:

from celery_demo2.tasks.task1 import send_email
from celery_demo2.tasks.task2 import send_msg
from celery_demo2.tasks.celery import app
from celery import current_app


result1 = send_email.delay('张三')
print(f"任务ID{result1.id}")
result2 = send_msg.delay('王五')
print(f"任务ID{result2.id}")

ret1 = app.control.inspect().registered()
print(ret1)

ret2 = app.control.inspect().registered('serializer', 'max_retries')
print(ret2)

print("*" * 100)

ret3 = current_app.control.inspect().registered()
print(ret3)

ret4 = current_app.control.inspect().registered('serializer', 'max_retries')
print(ret4)

print("程序执行完毕!")

运行结果:

registered_tasks

该方法同registered。

current_app.control.inspect().registered_tasks()
current_app.control.inspect().registered_tasks('serializer', 'max_retries')

report

report( ):为每个worker返回人类可读的报告。

同样启动celery两个worker。

示例代码:

from celery_demo2.tasks.task1 import send_email
from celery_demo2.tasks.task2 import send_msg
from celery_demo2.tasks.celery import app
from celery import current_app


result1 = send_email.delay('张三')
print(f"任务ID{result1.id}")
result2 = send_msg.delay('王五')
print(f"任务ID{result2.id}")

ret1 = app.control.inspect().report()
print(ret1)

print("*" * 100)

ret2 = current_app.control.inspect().report()
print(ret2)

print("程序执行完毕!")

运行结果:

reserved

reserved(safe=None):当前保留任务的返回列表,不包括scheduled/active。

同样启动celery两个worker。

示例代码:

from celery_demo2.tasks.task1 import send_email
from celery_demo2.tasks.task2 import send_msg
from celery_demo2.tasks.celery import app
from celery import current_app


result1 = send_email.delay('张三')
print(f"任务ID{result1.id}")
result2 = send_msg.delay('王五')
print(f"任务ID{result2.id}")

ret1 = app.control.inspect().reserved()
print(ret1)

print("*" * 100)

ret2 = current_app.control.inspect().reserved()
print(ret2)

print("程序执行完毕!")

运行结果:

revoked

revoked():返回已撤销任务的列表。

同样启动celery两个worker。

示例代码:

from celery_demo2.tasks.task1 import send_email
from celery_demo2.tasks.task2 import send_msg
from celery_demo2.tasks.celery import app
from celery import current_app


result1 = send_email.delay('张三')
print(f"任务ID{result1.id}")
result2 = send_msg.delay('王五')
print(f"任务ID{result2.id}")

ret1 = app.control.inspect().revoked()
print(ret1)

print("*" * 100)

ret2 = current_app.control.inspect().revoked()
print(ret2)

print("*" * 100)
print("停止某个任务")

app.control.revoke(result1.id, terminate=True)

ret3 = app.control.inspect().revoked()
print(ret3)

print("*" * 100)

ret4 = current_app.control.inspect().revoked()
print(ret4)

print("程序执行完毕!")

运行结果:

参考博文:

celery简单实现异步任务和定时任务_IT之一小佬的博客-优快云博客

Celery中,`_kombu.binding.celery.pidbox`和`_kombu.binding.celeryev`是Kombu(Celery使用的消息代理库)内部用于管理消息队列绑定的名称,它们属于Celery与消息代理(如RabbitMQ、Redis)交互时的内部机制,具体作用如下: ### 1. `_kombu.binding.celery.pidbox` 这是Celery用于**进程信箱(PID Box)**的队列绑定。 - **作用**:Celery的worker进程通过`pidbox`(进程信箱)实现内部通信(如任务控制、事件广播等)。 - **原理**: - 每个worker启动时会创建一个唯一的信箱队列(名称通常包含worker的PID)。 - `_kombu.binding.celery.pidbox`是这些信箱队列的**交换器(Exchange)绑定规则**,确保消息能路由到正确的worker。 - 例如,发送`control`命令(如`shutdown`)时,消息会通过此绑定路由到目标worker的信箱队列。 ### 2. `_kombu.binding.celeryev` 这是Celery用于**事件监控(Event)**的队列绑定。 - **作用**:Celery通过事件系统广播任务状态(如`task-started`、`task-succeeded`等),`celeryev`绑定用于接收这些事件。 - **原理**: - 事件消息会发布到名为`celeryev`的交换器,并绑定到特定队列(如`celeryev.*`)。 - 监控工具(如`flower`或自定义脚本)通过订阅这些队列获取实时事件数据。 ### 底层机制 两者均依赖Kombu的**动态绑定**功能: - 在RabbitMQ中,它们表现为`direct`类型的交换器,通过`routing_key`精确匹配队列。 - 在Redis中,则通过频道(Channel)实现类似逻辑。 ### 示例场景 - **发送控制命令**: ```python from celery import current_app current_app.control.broadcast('shutdown', destination=['worker1@host']) ``` 消息会通过`_kombu.binding.celery.pidbox`路由到`worker1`的信箱队列。 - **监控事件**: ```python from celery.events import EventReceiver def handle_event(event): print(f"Event: {event['type']}") with EventReceiver('redis://localhost:6379/0', handlers={'*': handle_event}) as receiver: receiver.capture(limit=None) ``` 事件数据通过`_kombu.binding.celeryev`绑定接收。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值