Celery 对象编辑最佳实践

Celery object editing best-practices

我有一个 celery 任务,它对对象属性执行操作并保存它。假设我们正在计算一个人的 bmi。我们取一个人的身高和体重并计算 bmi,然后将其保存在 person.bmi。在 Rails 的 DelayedJob 中,您只需创建一个实例方法:

Class Person

    def compute_bmi()
        self.bmi = (self.weight / self.height) * 703
        self.save

person.delay.compute_bmi()

但在 python 中,celery 任务通常似乎在 tasks.py 中分离出来,无法访问实例、Class 或数据库会话。以上述方式编写芹菜任务是不好的做法吗?

我的问题是我可能必须对几百万条记录执行此操作,因此向任务发送 json 用户数据的有效负载并返回 bmi 大部分是没有意义的,因为来自数据库的负载 read/write 是这项工作中最重要的部分之一。

使用 ironmq 的 ironworker 这样的服务似乎也无法以这种方式进行,我能想到的将其放入云中的唯一方法是启动一个 ec2/vps 实例。

是的,通常您会希望创建一个任务来接受一个人的 ID、检索它,然后执行请求的操作。我假设您使用的是 Django,因为它与 Python.

中的 Rails 最接近

例如:

@app.task
def determine_bmi(person_id):
    person = Person.objects.get(pk=person_id)
    person.compute_bmi()

这是 Celery 文档中关于 First Steps with Django 的部分。