サーバーを行うには1.フラスコフレームワークは、あなたがPythonのcode.pyの方法で実行することができますが、このアプローチは、本番環境で使用することができない、不安定な、例えば:ノーリターンの一定の確率出会い接続タイムアウト状況があります
複数のプロセスの効果を達成するためにapp.run()のパラメータを設定することにより1、。app.runの特定のパラメータを見てください:
注:同じ時間設定で、次のエラーが発生する場合はスレッドやプロセスは、同時に開くことができません。
2.高並行性の問題に対処するために、コルーチンを行うgevent:
#Ctripのサードパーティ製のパッケージが - ここgevent選択し、もちろん、あなたもeventletを選択することができます
ピップ行商をインストール
#の特定のコードを次のように:
フラスコインポートフラスコから
gevent.pywsgi輸入てWSGIServerから
gevent輸入サルから
#標準的な方法IOのpythonは、自動的に切り替えコルーチンを遮断gevent ioの遭遇方法geventに同じ名前に置き換えられます
monkey.patch_all()
#プロジェクトアプリケーションオブジェクトのアプリを作成します。1.
アプリ=フラスコ(__ name__)
#サーバーの初期化
WSGIServer(( "127.0.0.1"、5000)、アプリ).serve_forever()
#サービスを開始するには---これは、並行性を向上させ、プロジェクト協会のプロセスを実行するための方法です
パイソンcode.py
3.サービスを開始するように(gevent有する)Gunicornの形でアプリケーションのパッケージングは、[ 推奨 ]
グリーンユニコーン:として一般的に知られている - インストールはWSGIプロトコルgunicornサーバーを次の
ピップgunicornをインストール
ビューのコマンドラインオプション:正常にインストールさgunicornした後、コマンドライン経由で情報gunicornを使用して表示することができます。
$ Gunicorn -h
指定されたプロセスとポート番号:-wは:結合のIPアドレスとポート番号(バインド)-threads -k非同期マルチスレッドプログラムを表す:プロセス(作業者)が--bindことを示し
非同期の#Geventメイク使用(デフォルトの作業員が同期されます)
gunicorn -w 8 --bind 0.0.0.0:8000 -k 'gevent' ファイル名を指定して実行ファイル名:フラスコプログラムのインスタンス名
ランシナリオ2:情報は、実行コンフィギュレーションファイルにロードされます
gunicorn + geventオープン高い同時実行を使用します
インポートマルチプロセッシング
"" "Gunicorn + geventプロファイル" ""
#プリロードのリソース
preload_app =真
#バインド
バインド= "0.0.0.0:5000"
プロセス数
労働= multiprocessing.cpu_count()* 2 + 1
#スレッド
スレッド= multiprocessing.cpu_count()* 2
#キューの最大長、接続を許可されるよりも、リンクの長さ
バックログ= 2048
#作業モード
#worker_class = "卵:meinheld#1 gunicorn_worker"
worker_class = "gevent"
#ワーカースレッドとコルーチン影響力の仕事を使用してクライアントの同時クライアントの最大数、
worker_connections = 1200
#プロセス名
proc_nameに= 'gunicorn.pid'
#PIDプロセスのログファイル
pidファイル= 'app_run.log'
#ログレベル
ログレベル=「デバッグ」
#ログファイル名
ログファイル= 'debug.logに'
レコードへのアクセス#
アクセスログ= 'access.logを'
#アクセスレコード・フォーマット
access_log_format = '%(H)S%(T)S%(U)S%(Q)S'
#Runコマンドライン
gunicorn -c gunicorn_config.py flask_server:アプリ
使用meinheld + gunicorn +フラスコオープン並行性の高いアーティファクト
Meinheldの前提は、仮想環境にインストール:
ピップmeinheldをインストール
インポートマルチプロセッシング
"" "Gunicorn + meinheldプロファイル" ""
#プリロードのリソース
preload_app =真
#バインド
バインド= "0.0.0.0:5000"
プロセス数:カップの数* 2 + 1
労働= multiprocessing.cpu_count()* 2 + 1
スレッドカップ#2の数の数*
スレッド= multiprocessing.cpu_count()* 2
#キューの最大長、接続を許可されるよりも、リンクの長さ
バックログ= 2048
#作業モード
worker_class = "卵:meinheld#gunicorn_worker"
#ワーカースレッドとコルーチン影響力の仕事を使用してクライアントの同時クライアントの最大数、
worker_connections = 1200
#プロセス名
proc_nameに= 'gunicorn.pid'
#PIDプロセスのログファイル
pidファイル= 'app_run.log'
#ログレベル
ログレベル=「デバッグ」
#ログファイル名
ログファイル= 'debug.logに'
レコードへのアクセス#
アクセスログ= 'access.logを'
#アクセスレコード・フォーマット
access_log_format = '%(H)S%(T)S%(U)S%(Q)S'
#Runコマンドライン
gunicorn -c gunicorn_config.py flask_server:アプリ
広げます
コンセプト:コルーチンは仕事のプログラムは、プロセスがスレッドとして理解されていないではないということです - 関数呼び出しの戻り値なし。
コルーチン:また、マイクロスレッドとして知られているコルーチンは、シュレッド。
このコルーチン「ハング」とメカニズムを「ウェイクアップ」は、本質的に、プロセスは、サブプロセスの数にカットしますです、私たちにフラットなイベントコールバックモデルを使用する方法を提供します。長所:コンテキスト、プロセスの共有プロセスは、何百万人-のコルーチンを作成することができます。
歩留まりのpythonとサードパーティのライブラリのgreenletは、コルーチンを達成することができます。
greenletは、HSにおけるハンドオーバ処理の直接制御を提供する単純な発電機(収率)、より柔軟です。
歴史問題-GILロック
1.セキュリティスレッドは、一度に1つずつ、複数のスレッドがまだ正しく実行するプログラムを実行すると、スレッドの安全性を確保するために、だけでなく、複数のスレッドによってアクセス可能な共有データのために確保するために、しかし、マルチスレッド環境でありますスレッドにアクセスできます。各インタプリタプロセス、唯一つのスレッドのみ関連するロック、関連するリソースへのアクセスを得るために行うことができるが。それは、プロセスインタプリタが一つだけのスレッドを実行する場合は、見つけるのは簡単ですので、いくつかのスレッドが競争の間で、マルチスレッドの同時実行も、資源が存在しない場合には、不可能です。
2.だからCPythonのスレッドライブラリは、オペレーティングシステムのネイティブスレッドをカプセル化しながら、だけで実行で得られたスレッドGILがあるだろうと同時に、全体としてCPythonのプロセスは、他のスレッドはGILのリリースを待っている待機状態です。あなただけのシングルコアCPUを使用することができます。また、これは批判されてマルチスレッドのpython理由です。
ソリューション:Pythonは、より高度に同時マルチプロセス+コルーチンをお勧めします
IO多重化
IO多重化は、1つ以上のコアIO条件を指すプロセスが見つかったら、読み取り準備ができている指定され、それはプロセスに通知します。
1.(スレッドセーフ)を選択:アレイはselect()システムコールを介して複数のファイル記述子にそれを監視するために、()リターンを選択すると、ファイル記述子のアレイは、カーネルフラグを変更できるようになりますプロセスは、その後の読み取りおよび書き込み操作に得られるように、これらのファイル記述子。
2.世論調査(スレッドセーフ):それを選択して、自然の中で大きな違いがありませんが、世論調査は、ファイル記述子の数に上限はありません
3.のepoll(スレッドセーフ):ファイルディスクリプタは同時にちょうど記述子プロセスはちょうどそれはないだろう、我々は行動を取らない場合にのみ、再びそれを言うために、準備ができなったファイル教えて、エッジトリガ(レベルトリガとエッジトリガをサポートすることができます)これは、エッジ・トリガと呼ばれ、再び告げ、エッジ・トリガ理論性能は高いが、コードは非常に達成するために複雑になります。
非同期実装のpython
マルチプロセス+コルーチン+コールバック(イベント駆動型を行うには多重IO)
ライブラリパッケージコルーチン第三者:
-
gevent = greenlet + python.monkey(下地使用libevent時間複雑:O(N * logN個))
-
meinheld = greenlet + picoev(時間計算:O(N))
-
eventlet
picoevとlibevent
meinheldとgeventは通常gunicornを使用して、非同期であってもよいが、より良いmeinheld gevent性能の評価よりも、しかしため、比較的小さなmeinheldサポートのことができます。picoevとlieventを使用して、それぞれ、以下meinheldおよびパフォーマンスギャップのためgevent主な理由を分析します。
#libevent
メイン:タイマーイベント(nlogn)として、ヒープ(プライオリティキューイング)アルゴリズム、IOと信号が(リンクリストで実装)双方向キューを達成するために使用されています。
時間の複雑さ:O(N * logN個)
#picoev
picoev:著者によれば、2つの主要な最適化があります。
UNIX 1.主な考慮事項は、fdがされている(ファイル記述子)がそうなる操作ソケット状態で、高速見つけることがよりなり、全てのアレイに記憶され、その後、関連情報のFD、比較的小さな正の整数で表されます。速いです。
2.第二の点は、リングバッファ(128)と、ビットベクトル断面実現ソースによって最適化タイマイベントのアルゴリズムが、メイン達成バッファの位置まで各時点相当し、各バッファを見ることができるということですビットベクトルFDを使用して面積が時間ハッシュマッピング複雑さの一種である(O(N))に対応するように、数値であり、n fdが格納されているバッファの数です。
時間の複雑さ:O(N)
パフォーマンス:picoev> libevent
----コルーチン&スレッド&プロセスを理解します
2.思考:コルーチンの前にシーンチェンジ?
プログラムは、スイッチを遮断し送信すると
-
読むディスク
-
ファイルを読み書きします
-
ネットワークオペレーションIO
-
HTTPリクエストを送信し、受信