8

プロジェクトでは、実行時間の長いタスクの task.state をポーリングし、その実行ステータスを更新しようとしています。開発では機能しましたが、プロジェクトを本番サーバーに移動すると機能しません。タスクが花で開始されたことがわかっても、「PENDING」が表示され続けました。ただし、タスクが終了したときに更新された結果を取得できます。これは、task.state == 'SUCCESS' の場合です。私は本番環境でpython 2.6、Django 1.6、およびCelery 3.1を使用し、結果のバックエンドAMQPを使用しています。

@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')

別のメモとして、花は常に労働者のステータスをオフラインで表示しますが、タスクのステータスは正しいものでした。セロリ イベント 3.1.12 (Cipater) を使用すると、正しいワーカー ステータスが表示されます。

4

3 に答える 3

3

CELERY_TRACK_STARTEDの設定が関係していると思われます。ドキュメントの引用:

CELERY_TRACK_STARTED

True の場合、タスクがワーカーによって実行されると、タスクはそのステータスを「開始済み」として報告します。デフォルト値は False です。通常の動作では、そのレベルの粒度は報告されません。タスクは、保留中、終了済み、または再試行待ちのいずれかです。「開始」状態は、実行時間の長いタスクがあり、現在実行中のタスクを報告する必要がある場合に役立ちます。

たぶんCELERY_TRACK_STARTED = True、開発設定にはありますが、本番環境にはありませんか?

于 2014-07-02T16:43:14.917 に答える