0

ジョブのステータスを取得する必要があり、ジョブの計算を処理する新しいスレッドを生成するとします。

def post_view(request):
     g = Greenlet.spawn(heavy_job, arg1, arg2)
     return json.dumps(default_response)

そして、heavy_job で

def heavy_job(...):
   # call a 3rd party service to start doing its job
   job_id = (....)

   request.session['heavy_job_status'] = 'Running'
   status = 'Running'
   while status == 'Running':
       # ask the 3rd party guy "are you still running"
       resp = 3rdparty-service.query(job_id, ....)
       if resp != 'Running':
          return resp
       time.sleep(5)  # we will monkey patch the time with gevent's timer so no locking

この while ループ アプローチはスケーリングにとって本当に悪いのでしょうか? それとも、各 ajax リクエストが着信するたびにサードパーティ サービスにクエリを実行しますか?

4

1 に答える 1

1

申し訳ありませんが、まだコメントを書くことができないので、ここにJoelCornettによるコメントについてのメモを「while」と「for」のタイミングの例とともに書きます。

この例には誤りがあります。timeit()メソッドは初期化コードを1回だけ実行しますが、メインコードは何度も実行されるため、「while」ループでは、最初の実行を除くすべての実行は、「i」の値がすでに存在するため何もしません。 10. 10を100または1000に変更して、タイミングに違いはありません(ただし、「for」ループでは変更できません)。'while'の前に'i= 0'を追加して、非常に異なる結果を確認することもできます。

ただし、3rdparty-service.query()は、「for」ループと「while」ループの違いよりもかなり時間がかかる可能性があるため、コードには関係ないと思います。

于 2012-08-31T07:29:57.900 に答える