6

私はセロリ2.5.3とジャンゴセロリ-2.5.5を使用しています。そして、私はブローカーとしてmysqlを使用しています。

これは、ユーザーが別のサイトからデータを取得しているワーカーでジョブをキューに入れるように要求した場合のシナリオです。また、データのサイズによっては、これには数分かかる場合があります。ジョブが開始されたら、ローダーイメージを表示する必要があります。そして、ワーカーがデータ(html形式になります)のダウンロードを終了したら、ローダーイメージを取得したデータに置き換える必要があります。

セロリを使用している理由は、スクリプトが終了してタイムアウトするまでに30秒以上かかる場合があるためです。

現在、ajax呼び出しを使用してジョブのステータスを確認することを計画しており、この関数は一定の間隔で使用されます。

私はいくつかの質問を経験しました、そしてこれは私が思いついたものです

ワーカーを起動するために、私はこのコードを使用しています

def testCelery(request):
   result=testadd.apply_async()
   return HttpResponse(str(result.task_id))

これにより、task_idがクライアント側に返され、ajaxを使用してサーバーにリクエストを送信し、ジョブが終了したかどうかを確認します。

def getStat(request,task_id):
      res = AsyncResult(task_id)
      s=res.ready()
      if s==True:
         return HttpResponse(str(res.get()))
      else:
         return HttpResponse(str(s))

これが正しい方法であるかどうか、またはリアルタイムシナリオでどのように動作するかはわかりません。

ご意見をお聞かせください。

編集:ステータスを確認するためにdjceleryビューを使用

brunoが提案したようにコードを変更しましたが、次のようになります。

from djcelery import views as celery_views
def getStat(request,task_id):
    return celery_views.is_task_successful(request, task_id)

そして、それは機能しているようです。そして、まだtask_idでajax呼び出しを使用して、ステータスを取得します。

4

1 に答える 1

11

Django-celeryは、探しているビューとURLをすでに提供しています。views.task_statusどちらviews.is_task_successfulも、task_idを引数として取り、完全なステータス(タスクが失敗した場合の例外とトレースバックを含む)またはブールフラグのみを含むjson応答を返します。

たとえば、次のように追加しますurls.py

urlpatterns += patterns('djcelery.views',
    url(r'^task/status/(?P<task_id>.+)/$', 'task_status',
    name='task-status')
)
于 2012-07-09T12:07:36.490 に答える