【发布时间】:2013-02-11 07:36:45
【问题描述】:
# models.py
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
text_blob = models.CharField(max_length=50000)
# tasks.py
import celery
@celery.task
def my_task(person):
# example operation: does something to person
# needs only a few of the attributes of person
# and not the entire bulky record
person.first_name = person.first_name.title()
person.last_name = person.last_name.title()
person.save()
在我的应用程序中,我有类似的东西:
from models import Person
from tasks import my_task
import celery
g = celery.group([my_task.s(p) for p in Person.objects.all()])
g.apply_async()
- 芹菜泡菜 p 送给工人吧?
- 如果工作人员在多台机器上运行,整个 person 对象(连同主要不需要的庞大的 text_blob)是否会通过网络传输?有没有办法避免?
如何高效、均匀地将 Person 记录分配给在多台机器上运行的工作人员?
-
这是一个更好的主意吗?如果 Person 有几百万条记录,它不会压倒数据库吗?
# tasks.py import celery from models import Person @celery.task def my_task(person_pk): # example operation that does not need text_blob person = Person.objects.get(pk=person_pk) person.first_name = person.first_name.title() person.last_name = person.last_name.title() person.save() #In my application somewhere from models import Person from tasks import my_task import celery g = celery.group([my_task.s(p.pk) for p in Person.objects.all()]) g.apply_async()
【问题讨论】:
-
使用任务延迟并为此设置计时器
-
@catherine 在这种情况下计时器如何帮助我?
-
对不起那个计时器我的错误,它只是任务延迟。当人有数百万条记录时,celery 会延迟任务并通过一个一个发送来管理它
-
@catherine 所以,根据我从文档中了解到的情况,延迟只是 apply_async docs.celeryproject.org/en/latest/userguide/calling.html#basics 的捷径
-
是的,我的意思是这样的:my_task.delay(p.pk)