我有一个芹菜任务,当被调用时,只是点燃在扭曲的反应堆内执行一些并行代码。这里有一些示例(不是可运行的)代码来说明:
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内部,这似乎不可能(或者,至少,我不知道如何实现相同的效果)
此外,我无法删除反应堆,因为它是我正在使用的某些第三方代码的要求。其他获得相同结果的方法也很受欢迎。
答案 0 :(得分:0)
改为使用reactor.blockingCallFromThread
。