现在,我想将register
事件发布到某个特殊的交易所,我可以使用celery对其进行远程检索和处理。
实际上,我已经使用send_task
函数来实现这一点,但是它必须传递task_name
来指示应执行并使用哪个任务。因此,对于我的目标而言似乎并不完美。
我想要的是什么
register
消息发布到某些Exchange
; topic
或route_key
并捕获消息,用于执行任务; queue
)例如,就像这个工作流程:
注册:
generate_info
......
答案 0 :(得分:0)
这是我需要非标准交换时要做的事情。
在我的celeryconfig中,我指定该交换并为此分配队列(在我的情况下,我需要fanout
交换):
from kombu.common import Broadcast
from kombu import Exchange, Queue
CELERY_QUEUES = (
Broadcast(name='queue_name', exchange=Exchange('queue_name', type='fanout')),
)
然后我用celery multi生成工作器,并将其分配给我的特定队列,如下所示:
celery multi start 1 -A my_project -Q:1 queue_name -c:1 1 (other options go here)
然后我可以像这样将我的任务插入该队列:
from my_project import my_fancy_task
my_fancy_task.apply_async(args=(x, y, z), queue="my_queue")
我不太了解您的特定用例,如果您需要一台主机上的工作人员使用一个队列中的任务,然后又需要另一台主机上的工作人员使用另一队列中的任务,那么只需将您的任务分成两个队列并配置每个主机开始工作并将他们分配到您认为合适的队列中。也许这会有所帮助:Topic exchange ambiguity with RabbitMQ