Celery对象编辑最佳实践

时间:2015-02-26 18:46:57

标签: python celery background-process

我有一个芹菜任务,它对对象属性执行操作并保存它。让我们说我们计算一个人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中被分离出来,无法访问实例,类或数据库会话。以上述方式编写芹菜任务是不好的做法吗?

我的问题是我可能必须在几百万条记录上执行此操作,因此向任务发送用户数据的json有效负载并返回bmi大多没有意义,因为来自db读/写的负载是其中一个这项工作的最大部分。

看起来这样做就像使用像ironmq的铁工这样的服务是不可能的,我能想到把它放在云中的唯一方法是启动ec2 / vps实例。

1 个答案:

答案 0 :(得分:1)

是的,通常你会想要创建一个接受Person的id的任务,检索它,然后执行请求的动作。我假设您正在使用Django,因为它与Python中最接近Rails的类比。

例如:

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

以下是First Steps with Django上Celery文档中的部分。