web-dev-qa-db-ja.com

Pythonでのマルチプロセッシングflask

この質問はおそらく尋ねられ、おそらく答えられた以上のものですが、ここでそれを見つける場所がわかりません。

問題:pythonのフラスコ用のルーターがあり、呼び出しごとにデータを処理するのに時間がかかります。ルートへの各呼び出しはそれ自体がスレッドになるようにする必要があるため、リクエストがロードされるのを待つ必要はありません。

17

Flaskには組み込みの開発Webサーバーが付属しています ただし、本番環境では使用しないでください

リクエストごとの個別のプロセスや静的ファイルサービスなどのクールな機能を取得するには、実際のWebサービスとWSGIサービスをFlaskアプリケーションの前で実行する必要があります。

Flaskのドキュメントでは、 設定方法のいくつかの例 を提供しています。 Webサーバー/ WSGIの一般的な組み合わせはApache/mod_wsgiとNginx/Gunicornですが、他にも多くのオプションがあります。

14
Brendan Abel

これを設定する本当に良い方法は、アプリケーションサーバー(およびプロトコル)として「uwsgi」を使用し、フロントエンドプロキシとしてNginxを使用することです。これらは非常に高速でスケーラブルで、スレッドを処理し、Flaskが推奨する方法の1つです。 flaskドキュメンテーションは基本的な設定を提供しますが、このガイドは私が使用したものであり、インストールのためのはるかに詳細なウォークスルーを提供します。インストールコマンドに)ほとんどのLinuxフレーバーで動作します。

https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-14-04

5
Neil P

他の人が述べたように、これを行うための特別なツールがあります( celery が最高のようです)が、誰かがすぐに何かをセットアップして動作させたい場合は、Pythonのmultiprocessingモジュール:

_from flask import Flask
from multiprocessing import Process
import time

app = Flask(__name__)

def detachedProcessFunction(wait_time):
    i=0
    while i<wait_time:
        i = i+1
        print "loop running %d" % i
        time.sleep(1)

@app.route('/start')
def start():
    global p
    p = Process(target=detachedProcessFunction, args=(15))
    p.start()
    return render_template('layout.html')

if __name__ == '__main__':
    app.run(debug=True)
_

注:このメソッドは、オブジェクト関数(​​例:obj.objFunc())の実行には機能しません。 _EOFError: Ran out of input inside a class_を取得します。この場合、非オブジェクト/スタンドアロン関数内にオブジェクトを作成し、オブジェクトの作成に必要な引数を渡す必要があります。詳細については、 こちら をご覧ください

2
DankMasterDan