プロジェクトでは、実行時間の長いタスクの 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) を使用すると、正しいワーカー ステータスが表示されます。