celery的官方文档太简单,很多地方都没有说明清楚。
就我目前知道的,有事件events与广播broadcast这2中方式,在官方文档里面都没有找到正式的用法,是我在网上搜到的。
事件events通信方式
worker端
from celery.signals import worker_ready
def monitor_events(app):
def on_reload(event):
print(event)
# worker端代码
with app.connection() as conn:
recv = app.events.Receiver(conn, handlers={'reload':on_reload})
recv.capture(limit=None, timeout=None, wakeup=True)
@worker_ready.connect
def worker_ready(sender=None, **kwargs):
print('worker_ready...')
# 监听事件会阻塞,所以需要开启协程
thread = threading.Thread(target=monitor_events, args=[app])
thread.daemon = True
thread.start()
在worker_ready的是启动协程监听事件
控制程序端
with app.events.default_dispatcher() as d:
d.send('reload')
只需要简单的发送事件就可以了,还可以传递参数,详细请参照这篇文章
logging - using celery events for transferring python log records - Stack Overflow
广播broadcast方式
worker端
from celery.worker.control import Panel
@Panel.register
def command_reload(*args):
print('update source & restart service...')
# 在worker端执行代码
控制程序端
app.control.broadcast('command_reload')
显然这种方式更简单,但是只能单向通信,而events应该可以双向通信(我还没有测试过)
具体参照下面
https://medium.com/@djsmith42/creating-custom-celery-commands-1f0692d01918