我有一个芹菜工人,其中定义了处理功能(alpha_task)。我想从INSIDE这个职能部门(alpa_task)向芹菜工人提交另一份工作。新工作将负责处理计算结果。
所以简单地说,我希望结果由另一个芹菜工人池处理。 一个池负责执行该工作,另一个池负责处理结果。
芹菜工人 - >提交作业进行结果处理 - >另一位芹菜工人
我正在考虑使用不同的路由键和队列,因此工作人员不会将结果处理作业提交给他们自己,但它似乎不起作用。
app = Celery('celery_worker_A', backend='backendstring', broker='brokerstring')
@app.task
def process_alpha_task(json_input):
processor = TaskProcessor()
r = processor.process(json_input)
app.send_task('process_result', args=[r], kwargs={},queue='queue_result_processing', routing_key='key_result_processing')
问题在于,新提交的任务正在发送给同一个工作人员,该工作人员正在执行" alpha"任务,我收到有关未定义任务的错误,名为" process_result"这当然是真的。
我甚至尝试使用强制队列来运行这个芹菜工作者,因此它不会轮询除alpha_tasks之外的任何其他任务。
celery -A proj worker -Q alpha_tasks.
但它仍然似乎向自己提交任务并轮询它,即使我在send_task()和路由键中定义了其他队列。
如何实现我的目标,使用不同的芹菜工人处理结果?
//编辑:
我还有一个例子,应该更清楚。
显式运行worker以仅从task_processor队列处理任务:
celery worker -A task_processor -Q task_processor
task_processor.py
app = Celery('task_processor', backend=config.get('CELERY', 'backend'), broker=config.get('CELERY', 'broker'))
#submit new task and route to resultprocessor queue, Shouldn't be processed by this worker.
def test():
app.send_task('process_result', args=["ABC"], kwargs={}, queue="resultprocessor", routing_key="resultprocessorkey")
#TASK ROUTED CORRECTLY on worker start, NOT SUBMITTED TO THEMSELFS
test()
@app.task
def process_task(json_input):
print("Processing task")
#TASK ROUTING FAILED WHEN CALLED INSIDE BODY OF TASK, SUBMITTING TO THEMSELFS.
test()
print("Submitted request to process result")