我有一个芹菜任务,它对对象属性执行操作并保存它。让我们说我们计算一个人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实例。
答案 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文档中的部分。