2013-11-20 2 views
1

Работа над Джанго проекта питона, вот что я хочу:питон Джанго состояние гонки с сельдерей

  1. доступ пользователя Page1 с объектом аргумента функции longFunction() объекта вызывается и передается сельдерей так страницы может быть возвращено немедленно

  2. Если пользователь пытается получить доступ к Page2 с таким же объектом аргументом, я хочу страницу дотянуть до функции longFunction() объекта, вызванной Page1 прекращается.

Поэтому я попытался заблокировать mysql db row с объектами.select_for_update(), но это не сработает.

Вот упрощенная версия моего кода:

def Page1(request, arg_id): 
    obj = Vm.objects.select_for_update().get(id=arg_id) 
    obj.longFunction.delay() 
    return render_to_response(...) 

def Page2(request, arg_id): 
    vm = Vm.objects.select_for_update().get(id=arg_id) 
    return render_to_response(...) 

Я хочу, чтобы Page2 виснет на линии vm = Vm.objects.select_for_update().get(id=arg_id) до longFunction() завершена. Я новичок в сельдерее, и похоже, что соединение mysql, инициированное на странице 1, теряется при возврате страницы, даже если longFunction() не завершен.

Есть ли другой способ добиться этого?

Благодаря

ответ

1

Может быть, это может быть для вас Каталог путешествий:

from celery.result import AsyncResult 
from yourapp.celery import app 

def Page1(request, arg_id): 
    obj = Vm.objects.select_for_update().get(id=arg_id) 
    celery_task_id = obj.longFunction.delay() 
    return render_to_response(...) 

def Page2(request, arg_id, celery_task_id): 
    task = AsyncResult(app=app, id=celery_task_id) 
    state = task.state 
    while state != "SUCCESFUL": 
     # wait or do whatever you want 
    vm = Vm.objects.select_for_update().get(id=arg_id) 
    return render_to_response(...) 

Больше информации на http://docs.celeryproject.org/en/latest/reference/celery.states.html

+0

Обратите внимание, что лучше подождать в интерфейсе, вы можете взглянуть на jobtastic, например: http://policystat.github.io/jobtastic/, что делает это проще. – asksol

0

Блокировка базы данных от select_for_update освобождается, когда сделка закрывается (в странице 1). Этот замок не попадает в задачу сельдерея. Вы можете заблокировать задачу сельдерея, но это не решит вашу проблему, потому что страница 2 может быть загружена до того, как задача сельдерея получит блокировку.

Ответ Микеля будет работать. Вы также можете поместить блокировку в кеш, как описано в the celery cookbook.

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