web-dev-qa-db-ja.com

Flaskでスレッドまたはタスクキューなしでバックグラウンドジョブを実行するにはどうすればよいですか?

REST Flask-restplusを使用したAPIを構築しています。エンドポイントの1つはクライアントからアップロードされたファイルを取得して分析を実行します。ジョブは最大30秒を使用します。ジョブにメインプロセスをブロックします。これにより、エンドポイントは200または201の応答をすぐに返しますが、ジョブは引き続き実行できます。結果はデー​​タベースに保存され、後で取得されます。

長期実行ジョブには2つのオプションがあるようです。

  1. スレッディング
  2. タスクキュー

スレッド化は比較的単純です。しかし問題は、Flask appのスレッド数に制限があることです。スタンドアロンPython appでは、スレッドのキューを使用できます。しかし、これはis REST api、各要求呼び出しは独立しています。そのためのグローバルキューを維持する方法があるかどうかはわかりません。そのため、要求がスレッド制限を超えた場合、より多くの要求を受け入れることができる。

CeleryとRedisを使用したタスクキューはおそらくより良いオプションです。しかし、これは単なる概念実証であり、タイムラインはちょっとタイトです。セロリのセットアップ、Flaskを使用したRedisは簡単ではありません。Windowsである開発マシンで多くの問題を抱えています。AWSにデプロイするのは複雑なことです。

この場合の3番目のオプションはあるのでしょうか。

9
ddd

Celery を使用することを強くお勧めします。既に投稿で言及しています。これは、このユースケース用に正確に構築されています。彼らのドキュメントは本当に有益であり、すぐに立ち上げて実行できるオンラインの例が不足しているわけではありません。

さらに、 [〜#〜] this [〜#〜] は、最初に使用する優れた最初のリソースになると思います。

6
Harrison

Celeryは、過去に何百万ものジョブを管理するために私がかなりうまく使用したこの問題の素晴らしい解決策です。

唯一の真の欠点は、初期の学習曲線と、問題が発生した場合のデバッグの複雑さです(特に何百万ものジョブで発生する可能性があります)。

ホストされたソリューションを利用している場合は、 Coherence API Language-Integrated Distributed Tasks を確認してください。

完全に開示すると、それは私のプロジェクトでセロリの代替品として私が作った製品です。開始するのはCeleryよりも比較的簡単で、ワーカー(またはキュー)インフラストラクチャを管理する必要はありません。

1
brthornbury