7

Flask アプリで長い作業を行う必要があります。そして、私はそれを非同期にしたい。作業を開始してから、javascript からステータスを確認してください。

私は次のようなことをしようとしています:

@app.route('/sync')
def sync():
    p = Process(target=routine, args=('abc',))
    p.start()

    return "Working..."

しかし、これは機能しないガンコーン労働者を生み出します。

どうすれば解決できますか?セロリのようなものを使うべきですか?

4

2 に答える 2

11

多くのオプションがあります。Celery または Twisted を使用して、独自のソリューションを開発できます (既に作成されているオプションが他にもあると思いますが、それらは最も一般的なものです)。

社内ソリューションの開発は難しくありません。multiprocessingPython 標準ライブラリのモジュールを使用できます。

  • タスクが到着したら、タスク ID とステータスを含む行をデータベースに挿入します。
  • 次に、終了時に行ステータスを更新する作業を実行するプロセスを起動します。
  • タスクが終了したかどうかを確認するビューを使用できます。これは、実際には対応するステータスを確認するだけです。

もちろん、計算の結果をどこに保存したいか、エラーが発生した場合はどうなるかを考える必要があります。

セロリと一緒に行くのも簡単です。次のようになります。非同期で実行される関数を定義するには:

@celery.task
def mytask(data):

    ... do a lot of work ...

次に、 のようにタスクを直接呼び出す代わりに、mytask(data)すぐに実行するdelayメソッドを使用します。

result = mytask.delay(mydata)

最後に、結果が利用可能かどうかを次の方法で確認できますready

result.ready()

ただし、Celery を使用するには、外部ワーカープロセスを実行する必要があることに注意してください。

私は Twisted を見たことがないので、これよりも複雑かどうかはわかりません (ただし、やりたいことを実行しても問題ないはずです)。

いずれにせよ、これらのソリューションはどれも Flask で正常に機能するはずです。結果を確認するには、Javascript を使用するかどうかはまったく問題ではありません。ステータスをチェックするビューが JSON を返すようにするだけです (Flask の を使用できますjsonify)。

于 2012-09-07T12:56:50.460 に答える
2

私はrabbitmqやactivemqなどのメッセージブローカーを使用します。フラスコプロセスはメッセージキューにジョブを追加し、長時間実行されているワーカープロセス(またはプールまたはワーカープロセス)はジョブをキューから削除して完了します。ワーカープロセスはデータベースを更新して、フラスコサーバーがジョブの現在のステータスを認識し、この情報をクライアントに渡すことができるようにすることができます。

セロリを使用することはこれを行うための良い方法のようです。

于 2012-09-07T14:49:29.663 に答える