2017-01-26 16 views
0

私のdjangoアプリケーションでは、再発行エンドポイントにヒットした後、その機能がトリガーされてそのステータスを確認するアクション(再発行アクション)によってトリガーされる関数があります。別のAPI呼び出しで30分。その機能は次のとおりです。djangoで30分のAPIコールを実行する方法

timeout = time.time() + 60 * 30 
     published_flag = False 
    while time.time() < timeout: 
       data = requests.get(apiUrl + dist_id).json() 
       try: 
        published_flag = data['flags'] 
        if published_flag: 
         break 
        else: 
         time.sleep(5) 
         continue 
       except KeyError: 
        break 

このタイムアウトは30分であり、非常に長くなります。しかし、フラグ状態が変わる最悪のシナリオは30分です。このアクションは、複数回トリガーすることができます(複数の再発行ボタンを押すことができます)。エンドポイントが実質的にタイムアウトするのは、エンドポイントが動作するには長すぎるためです。だから私はフロントエンドにWebソケットを介してデータをプッシュします。

これを行うにはスマートな方法がありますか?

+1

「セロリー」http://www.celeryproject.orgを使って低速なタスクをバックグラウンドで実行することができます。タスクが完了したときにクライアントに通知するWebソケット接続を維持します。 – Enix

+0

しかし、一度に6-7の再発行を行うことができます。だから、それぞれのために、私は労働者の数を調整するのですか? – foxtrot3009

+0

はい、あなたが原因です。セロリのチュートリアルhttp://docs.celeryproject.org/en/latest/userguide/workers.html#starting-the-workerを見ることができます – Enix

答えて

0

エニックスが書いたように、セロリを使うべきです。しかし、あなたは多くの労働者を必要としません。実際にはセロリの仕事の中でsleepを呼ぶことはありません。後で再試行できます。だから、すべての仕事は本当に短くて、あなたはちょうど1〜2人の労働者が必要です。

@app.task(bind=True, max_retries=60*30/5) 
def do_whatever(self, dist_id): 
    data = requests.get(apiUrl + dist_id).json() 
    if 'flags' not in data: 
     self.retry(countdown=5) 
関連する問題