如何在reactor中用并行代码确认芹菜任务?

时间:2013-03-26 20:58:54

标签: 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_task_in_reactor)

(为了简单起见,请假设当工作人员收到任务时反应堆已经在运行;工作人员出现时,我使用信号@worker_process_init.connect在另一个线程中启动我的反应堆)

当我调用run_task.delay()时,任务很快完成(因为它不等待run_task_in_reactor()完成,只调度它在反应堆中的执行)。并且,当run_task_in_reactor()最终运行时,do_something()do_something_more()可以抛出异常,这将是无效的。

使用pika从我的队列中消耗,我可以使用do_something_more()内的ACK来使工作人员通知正确完成任务,例如。然而,在Celery内部,这似乎不可能(或者,至少,我不知道如何实现相同的效果)

此外,我无法删除反应堆,因为它是我正在使用的某些第三方代码的要求。其他获得相同结果的方法也很受欢迎。

1 个答案:

答案 0 :(得分:0)

改为使用reactor.blockingCallFromThread