2017-01-20 2 views
0

У меня есть модель Django с колонкой celery_task_id. Я использую RabbitMQ в качестве брокера. Существует функция сельдерея, называемая test_celery, которая принимает модельный объект в качестве параметра. Теперь у меня есть следующие строки кода, которые создают задачу сельдерея.Изменился ли идентификатор задачи сельдерея после перераспределения

def create_celery_task(): 
    celery_task_id = test_celery.apply_async((model_obj,), eta='Future Datetime Object') 
    model_obj.celery_task_id = celery_task_id 
    model_obj.save() 
    ---- 
    ---- 

Теперь внутри функции сельдерея я проверки, если идентификатор задачи такой же, как из одной хранимой в БД или нет.

@app.task 
def test_celery(model_obj): 
    if model_obj.celery_task_id == test_celery.request.id: 
     ## Do something 

Моя проблема в том, что есть много случаев, когда я вижу задачу быть получен и успех в журнале, но не выполняет код внутри если условия.

Возможно ли, что идентификатор задачи сельдерея изменится после перераспределения. Или есть другие причины.

ответ

0

Одна из рекомендаций - не передавать объекты базы данных/ORM в задачи Celery, поскольку они могут содержать устаревшие данные. Попробуйте переписать задачу как:

@app.task 
def test_celery(model_obj_id): 
    model_obj = YourModel.objects.get(id=model_obj_id) 
    if model_obj: 
     if model_obj.celery_task_id == test_celery.request.id: 
      ## Do something 
+0

Но все же это не отвечает на вопрос. Будет ли «test_celery.request.id» изменяться во время процесса синхронизации rabbitmq или во время повторного распределения работников. – Pattu

+0

Я думаю, что ID не меняется. Я предполагаю, что левая часть условия не работает, т. Е. Model_obj.celery_task_id, потому что вы предоставляете объект задаче. Ваша догадка заключается в том, что test_celery.request.id изменяется во время процесса синхронизации, и это вызывает проблему. –