芹菜任务不会被撤销

时间:2011-09-14 11:34:08

标签: django celery

我通过django的celery(版本2.3.2)运行多个模拟作为任务。模拟由另一个任务设置:

在views.py中:

result = setup_simulations.delay(parameters)
request.session['sim'] = result.task_id # Store main task id

在tasks.py中:

@task(priority=1)
def setup_simulations(parameters):
    task_ids = []
    for i in range(number_of_simulations):
        result = run_simulation.delay(other_parameters)
        task_ids.append(result.task_id)
    return task_ids

初始任务(setup_simulations)完成后,我尝试按如下方式撤销模拟任务:

main_task_id = request.session['sim']
main_result = AsyncResult(main_task_id)
# Revoke sub tasks
from celery.task.control import revoke
for sub_task_id in main_result.get():
    sub_result = AsyncResult(sub_task_id); sub_result.revoke() # Does not work
    # revoke(sub_task_id) # Does not work neither

当我查看“python manage.py celeryd -l info”的输出时,任务就会被执行,好像什么也没发生过一样。有人可能出错了什么想法?

1 个答案:

答案 0 :(得分:1)

正如您在评论中提到的那样,revoke是一个远程控制命令,因此目前只有amqp和redis传输支持它。

您可以通过在数据库中存储已撤销的标记来自行完成此操作,例如:

from celery import states
from celery import task
from celery.exceptions import Ignore

from myapp.models import RevokedTasks


@task
def foo():
    if RevokedTasks.objects.filter(task_id=foo.request.id).count():
        if not foo.ignore_result:
            foo.update_state(state=states.REVOKED)
        raise Ignore()

如果您的任务正在某个模型上工作,您甚至可以在其中存储一个标志。