2015-02-26 4 views
0

У меня есть задача celery, выполняющая операцию по атрибутам объектов и сохраняющая ее. Скажем, мы вычисляем людей bmi. Мы берем людей высоту и вес и вычисляем bmi, а затем сохраняем их на person.bmi. В DelayedJob Rails ты бы просто сделать метод экземпляра:Рекомендации по редактированию объектов сельдерея

Class Person 

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

person.delay.compute_bmi() 

Но питона задачи сельдерей обычно, кажется, должен быть выделен в tasks.py без доступа к примеру, класс или сессии базы данных. Плохо ли практика написания задач сельдерея, которые делают это выше?

Моя проблема заключается в том, что мне, возможно, придется сделать это на нескольких миллионах записей, поэтому отправка задачи json-полезной нагрузки пользовательских данных и возврат bmi в основном бессмысленны, так как загрузка из db read/write является одной из самые большие части работы.

Похоже, что делать это таким образом было бы невозможно с помощью таких сервисов, как ironworker Ironmq, единственный способ, которым я могу представить это в облаке, - это развернуть экземпляр ec2/vps.

ответ

1

Да, обычно вы хотели бы выполнить задачу, которая принимает идентификатор Person, извлекает его и затем выполняет запрошенное действие. Я предполагаю, что вы используете Django, поскольку это самая близкая аналогия с Rails в Python.

Например:

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

Вот раздел в сельдерей документации на First Steps with Django.

+1

Колба на самом деле. Да, как вы это сделали, я сейчас это делаю. Я получаю, что передача объекта - это плохая практика, а не object_id и выполнение поиска самостоятельно. Но когда некоторые из облачных провайдеров не поддерживают такие вещи, это меня смутило. – cbron

Смежные вопросы