Celery:任务执行得太快,无法检索更新的数据库

时间:2014-09-12 02:13:38

标签: django celery django-celery

我正在使用 Cerely (版本3.0.25)来管理我的django(版本1.5.4)项目上的延迟任务。

我在保存查询后尝试通过芹菜检索更新的数据库时出现问题。

以下是示例代码。 ( views.py 的)

# import model
from .models import SampleModel

# import celery task
from utils.tasks import GetLastID

# Sample function in view
def save_query():

     # Sample saving query. Let's assume that query.id returns value "7"
     query = SampleModel(field_A="A", field_B="B")
     query.save()

     # Case 1 : this return "6" which is a past 'Last ID value' (not expected)
     GetLastID.apply_async(args=[], countdown=0)

     # Case 2 : this return "7" which is most recent ID value as expected
     GetLastID.apply_async(args=[], countdown=1)

简而言之,当我将任务延迟一秒时,我得到了预期的价值。但是,当我毫不拖延地执行芹菜任务时,我得到了没有更新的值。

我认为问题是“芹菜执行速度太快,无法检索更新的数据库”。

我怎样才能毫不拖延地获得预期值?以下是我认为的伪代码。

(query.save() | GetLastID()).delay()

提前致谢。

1 个答案:

答案 0 :(得分:2)

一种方法是在调用celery任务之前显式提交更改。

使用django.db.transaction.commit_manually

的示例
from django.db import transaction

@transaction.commit_manually  # <----
def view(request, ...):
    query = SampleModel(field_A="A", field_B="B")
    query.save()
    transaction.commit()  # <----

    GetLastID.apply_async(args=[])