whi*_*hat 6 python django celery celerybeat
我正在用芹菜运行定期任务。其中一项任务通过过滤器从数据库获取对象:
pages = Page.objects.filter(active=True)
Run Code Online (Sandbox Code Playgroud)
最初(在启动 celery 本身之前),db 中有 10 个这样的对象active=True。该任务在启动时会在所有这 10 个对象上相应地执行。
from django.db import transaction
from celery.task import task
from celery import group
from .models import Page
#@transaction.atomic
@task()
def check_pages():
#@transaction.commit()
pages = Page.objects.filter(active=True) #not updated later
g = group(page_check.s(page.id) for page in pages)
g()
#settings.py
app.conf.beat_schedule = {
'run-every-1-second': {
'task': 'tasks.check_pages',
'schedule': 1.0,
},
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我添加另一个Page对象active=True,则任务中不会识别或过滤该对象(该任务已经定期运行)。
我知道obj.reload_from_db()。但这仅适用于重新加载对象,而不适用于<QuerySet>.
我也尝试使用transaction.commit()with @transaction.atomic。但这会停止任务的执行,因为事务不适用于多个工作人员和任务。
我在这里做错了什么?
使用all()方法。这会复制没有缓存结果的查询集。检查这个文档
所以你可以
@task()
def check_pages():
#@transaction.commit()
pages = Page.objects.filter(active=True).all() # now it will update later
g = group(page_check.s(page.id) for page in pages)
g()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7768 次 |
| 最近记录: |