私のdjangoアプリには、アクション(再公開アクション)によってトリガーされる関数があります。再公開エンドポイントがヒットした後、その関数がトリガーされ、別のAPI呼び出しを介して30分間そのステータスを確認します。その関数は次のとおりです。
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分です。このアクションは複数回トリガーできます(複数の再発行ボタンを押すことができます)。エンドポイントが機能するには30分が長すぎるため、エンドポイントは基本的にタイムアウトします。そこで、Webソケットを介してデータをフロントエンドにプッシュします。
これを行うためのよりスマートな方法はありますか?
Enixが書いたように、Celeryを使用する必要があります。しかし、あなたは多くの労働者を必要としません。実際には、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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加