在我的项目中,我默认使用交易。我想为几个芹菜任务禁用它们。但是当我使用:
from django.db import transaction
@transaction.non_atomic_requests
@app.task(bind=True, name='my_task')
def tasks_monitor(task):
m = MyModel.objects.get(id=1)
m.value = 5
m.save()
time.sleep(40)
我的芹菜任务仍在进行交易。看起来@transaction.non_atomic_requests
和@transaction.atomic_requests
没有应用。
UPD:尝试交换订单,而不是工作。
当我禁用DATABASES['default']['ATOMIC_REQUESTS'] = False
时,它按预期工作
答案 0 :(得分:0)
transaction.non_atomic_requests
用于装饰视图,它不会对Celery任务产生任何影响。但事情就是这样:ATOMIC_REQUESTS
设置也不应该有任何效果!它在Django中被评估的唯一地方是core.handlers.base.make_view_atomic
,它包含了视图。
因此,我的假设是您使用CELERY_TASK_ALWAYS_EAGER=True
(旧版本的Celery中的CELERY_ALWAYS_EAGER
)运行您的应用程序。在这种情况下,视图的事务处于活动状态。如果将其设置为False
并在工作程序中运行任务,则应自动进行每个数据库操作。