Rabbitmq 如何在reactor中使用并行代码确认芹菜任务?
我有一个芹菜任务,当调用它时,它只是在一个扭曲的反应器中触发一些并行代码的执行。下面是一些示例(不可运行)代码来说明:Rabbitmq 如何在reactor中使用并行代码确认芹菜任务?,rabbitmq,message-queue,celery,reactor,Rabbitmq,Message Queue,Celery,Reactor,我有一个芹菜任务,当调用它时,它只是在一个扭曲的反应器中触发一些并行代码的执行。下面是一些示例(不可运行)代码来说明: def run_task_in_reactor(): # this takes a while to run do_something() do_something_more() @celery.task def run_task(): print "Started reactor" reactor.callFromThread(run_tas
def run_task_in_reactor():
# this takes a while to run
do_something()
do_something_more()
@celery.task
def run_task():
print "Started reactor"
reactor.callFromThread(run_task_in_reactor)
(为了简单起见,请假设当工作者收到任务时反应器已经在运行;我使用信号@worker\u process\u init.connect
在工作者出现时在另一个线程中启动我的反应器)
当我调用run\u task.delay()
时,任务会很快完成(因为它不会等待run\u task\u in_reactor()
完成,只会安排它在reactor中的执行)。而且,当run\u task\u in_reactor()
最终运行时,do\u something()
或do\u something\u more()
会抛出一个异常,该异常不会被注意到
使用pika
从我的队列中消费,我可以在do\u more()
中使用ACK来通知工作人员任务的正确完成。然而,在芹菜里面,这似乎是不可能的(或者,至少,我不知道如何达到同样的效果)
此外,我不能移除反应堆,因为这是我正在使用的某些第三方代码的要求。实现相同结果的其他方法也值得赞赏。使用
reactor。改为阻止来自线程的调用。请解释在何处以及如何使用它,甚至包括question@MauricioGracia它实际上只是reactor.blockingCallFromThread
而不是问题代码中的reactor.callFromThread
。