私たちは、CPUの速度は、ディスク、ネットワーク、および他のIOよりもはるかに高速である、知っています。一つのスレッドでは、CPUの速度が非常に速いコード実行である、しかし、そのようなファイルを読み書き、ネットワークデータを送信するようにIO操作の場合には、次のステップに進む前に完了するために、IO操作を待つ必要があります。この状態は、同期IOと呼ばれています。
他のコードは、現在のスレッドを実行するCPUによって実行することができない必要ながらIO動作中に、現在のスレッドが中断されます。
現在のスレッド上のIO操作がブロックされているため、原因となる他のコードが実行できないので、我々は、同時に複数のユーザのために、コードを実行する複数のスレッドまたは複数のプロセスを使用しなければなりません。各ユーザーは、あなたが中断されたIOスレッドへのリード線が発生した場合、他のユーザスレッドが影響を受けません、スレッドが割り当てられます。
マルチスレッドおよびマルチプロセス・モデルは、並行性の問題を解決するが、システムが限界スレッドなく増加することはできません。スレッドの過剰な数は、CPU時間は厳しい性能低下をもたらす、より少ないコードを実行してリアルタイムにスレッドスイッチに費やされた後にオーバーヘッドを切り替えるスレッドも大きいからです。
我々は問題を解決したいので、重大な不適合の高速CPUとIOデバイスの亀の速度能力を実行することで、マルチスレッドとマルチプロセスは、この問題を解決するだけの方法です。
この問題を解決するための別の方法は、非同期IO IOです。コードは、時間のかかる操作IOを実行する必要がある場合には、IOコマンドはのみIOの結果を待たずに発行され、その後、他のコードを実行するために行ってきました。しばらくの間、IOリターン結果の後に、処理のためにCPUに通知します。
1)aiohttp
asyncio
あなたは、シングルスレッドの同時IO操作を実現することができます。もしクライアントだけではなく、パワープレー。場合はasyncio
HTTP接続はIO操作であるため、Webサーバーなどのサーバー上で使用され、シングルスレッド+することができcoroutine
、高い同時実行のサポート複数のユーザー。
asyncio
TCP、UDP、SSL、および他のプロトコルを実装し、aiohttp
に基づいてasyncio
HTTPフレームワークの実装です。
インストール:
aiohttpをインストールするPIP
例:
'' ' 使用搭建ウェブ服务aiohttp ''' インポートasyncio からaiohttpインポートウェブ 非同期指数(リクエスト)DEFを: 待つ asyncio.sleep(0.5 ) 戻り web.Response(本体= ' <H1>インデックス</ H1> ' ) 非同期を DEFハロー(リクエスト): 待つ asyncio.sleep(0.5 ) テキスト = ' <H1>こんにちは、%S </ H1> '%のrequest.match_info [ ' 名前' ] 戻り web.Response(本体= text.encode('UTF-8 ")、CONTENT_TYPE = ' text / htmlの' ) 非同期DEF INIT(ループ): アプリ = web.Application(ループ= ループ) app.router.add_route(' GET '、' / ' 、指数) app.router.add_route(' GET ' ' /ハロー/ {名前} ' ハロー) SRV = 待つ(app.make_handler()loop.create_server、' 0.0.0.0 ' 6000 ) 印刷(' サーバーがhttp://0.0.0.0:6000で開始しました") リターンのSRV ループ = asyncio.get_event_loop() loop.run_until_complete(INIT(ループ)) loop.run_forever()
今回は、あなたがアドレスを介してWebサービスにアクセスすることができます
ことに注意してくださいaiohttp
初期化機能がinit()
ありcoroutine
、loop.create_server()
その後、使用asyncio
TCPサービスを作成します。