2014-07-01 33 views
6

W projekcie próbuję odpytać task.state długo działającego zadania i zaktualizować jego stan pracy. Działało to w fazie rozwoju, ale nie zadziała, gdy przeniesię projekt na serwer produkcyjny. Ciągle otrzymywałem "OCZEKUJĄCY", nawet jeśli widzę, że zadanie rozpoczęło się na kwiatku. Jednak nadal mogę uzyskać zaktualizowane wyniki po zakończeniu zadania, które po uruchomieniu task.state == "SUCCESS". Używam Pythona 2.6, Django 1.6 i Celery 3.1 w produkcji, backend wyniku AMQP.AsyncResult (id_zadania) zwraca stan "OCZEKUJĄCY", nawet po uruchomieniu zadania.

@csrf_exempt 
def poll_state(request): 
    data = 'Fail' 

    if request.is_ajax(): 
      if 'task_id' in request.POST.keys() and request.POST['task_id']: 
        task_id = request.POST['task_id'] 
        email = request.POST['email'] 
        task = AsyncResult(task_id) 
        print "task.state=", task.state 
        if task.state == 'STARTED': 
          task_state = 'Running' 
          data = 'Running' 
          #data = 'Running' 
        elif task.state == 'PENDING' or task.state == 'RETRY': 
          task_state = 'Waiting' 
          data = 'Pending' 
        elif task.state == 'SUCCESS': 
          task_state = 'Finished' 
          if task.result: 
            data = task.result 
          else: 
            data = 'None' 

        else: 
          task_state = task.state 
          data = 'Error' 
          print 'data status =', task_state 
      else: 
        task_state = task.state 
        data = 'Error' 
    else: 
      task_state = task.state 
      data = "Error" 

    json_data = json.dumps({'task_state':task_state, 'task_data':data}) 

return HttpResponse(json_data, mimetype='application/json') 

na innej notatce, kwiat zawsze pokazuje status pracowników w trybie offline, ale status zadań był prawidłowy. Podczas używania zdarzeń selera 3.1.12 (Cipater), pokazuje on prawidłowy status pracownika.

Odpowiedz

1

Jest to prawdopodobnie związane z ustawieniem CELERY_TRACK_STARTED. Cytowanie docs:

CELERY_TRACK_STARTED

Jeśli prawda zadaniem będzie raportować swój status „zaczęło”, gdy zadanie jest wykonywane przez pracownika. Domyślną wartością jest Fałsz, ponieważ normalne zachowanie polega na tym, aby nie zgłosić tego poziomu szczegółowości na poziomie . Zadania są albo oczekujące, zakończone, albo oczekujące na ponowienie . Posiadanie stanu "uruchomionego" może być użyteczne w przypadku długich uruchomionych zadań i istnieje potrzeba zgłoszenia, które zadanie jest obecnie uruchomione na .

Może masz CELERY_TRACK_STARTED = True w ustawieniach programistycznych, ale nie w produkcji?

+1

Miałem "CELERY_TRACK_STARTED = True" w moim settings.py i ustawiłem celeryconfig.py z os.environ.setdefault ("DJANGO_SETTINGS_MODULE", "mysite.settings"). Problem polega na tym, że AsyncResult (task_id) .state zawsze zwraca status "PENDING", więc mój szablon nie może zostać zaktualizowany do "STARTED" po uruchomieniu zadania. Jednak zarówno monitorowanie zdarzeń kwiatowych, jak i selera pokazało, że zadanie rozpoczęło się prawidłowo. Bardzo zdezorientowany. – user3795121

+0

Czy możesz uruchomić terminal, na którym działa twój prodution 'seler przeglądaj conf --app twoja_nazwa_użytkownika ', aby sprawdzić, czy ustawienie' CELERY_TRACK_STARTED' było dobrze załadowane? –

+0

To jest problem! app.conf nie jest aktualizowany, dopóki nie ustawię go jawnie w tasks.py. Domyślam się, że os.environ.setdefault ("DJANGO_SETTINGS_MODULE", "mysite.settings") nie działa. Nadal nie mam pojęcia, dlaczego tak się stało. – user3795121