我通过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”的输出时,任务就会被执行,好像什么也没发生过一样。有人可能出错了什么想法?
答案 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()
如果您的任务正在某个模型上工作,您甚至可以在其中存储一个标志。