- asyncio新しいモジュールをpython3.4した後、それは私たちがIO(IOを[HTTPのみネットワーク接続がネットワークIO操作である])を検出することができ、アプリケーションレベルのスイッチ(実装非同期IOを)。注意:TCPレベルはHTTPプロトコルのみを送信することはできません要求を送信することができますasyncio。
- 非同期IO:いわゆる「非同期IOは、」それが終了したとき、あなたは通知されます、あなたはネットワークIO操作を開始するが、それは終了するために、あなたは他のことをし続けることができます待ってはいけないということです。
- 実装:+コルーチンネジ付き非同期IO操作。
- 非同期コルーチン使い方
次は、達成コルーチンを見てみましょう、Pythonの3.4から始めて、PythonはPythonの3.5で、オブジェクトベースを生成するためにコルーチンの概念が、コルーチンのこのバージョンを追加またはasync /のawait増加、より便利なコルーチンを達成するように。まず、私たちは、次の概念を理解する必要があります。
-
event_loop:イベントループ、無限ループの等価な、我々は条件が発生した場合、それは、対応する治療を呼び出します。このイベントループにいくつかの機能を登録することができます。
-
コルーチン:中国語の翻訳は、協会を代表して、コルーチンと呼ばれているが、我々は、それがサイクルイベントを呼び出すことになるサイクルタイムにコルーチンオブジェクトを登録することができ、多くの場合、Pythonでのプロセスオブジェクトの種類を指します。私たちは、あなたが呼び出したとき、すぐに実行されませんメソッドを定義するために非同期キーワードを使用しますが、コルーチンオブジェクトを返すことができます。
-
タスク:さらにコルーチンオブジェクトにカプセル化されたタスクは、各タスクのステータスを含んでいます。
-
未来:将来の業績へのガイドまたは実行するタスクが行われず、タスクは実際には本質的な違いはありません。
また、我々はまた、それだけで、特にコルーチンを定義するために、Pythonの3.5から登場し、非同期/待つのキーワードを知っている必要があります。ここで、非同期コルーチンを定義し、保留中の実行をブロックするための方法を待っています。
- コルーチンの定義
例:
時間のインポートSLEEP インポートASYNCIO 非同期DEFの要求(URL): 印刷(「要求されたURL 」) SLEEP( 2 ) 印刷(「成功ダウンロード」) #は、特別なコルーチンオブジェクト要求機能は内部で実行されていない返す = C要求(「www.baidu.com 」) #オブジェクトをインスタンスイベントループれる ループ= asyncio.get_event_loop() #のイベントループオブジェクトは、タスクオブジェクトを作成し、コルーチンは、に基づいて、オブジェクトのオブジェクトにカプセル化された タスク= (loop.create_task C) #タスクオブジェクトの方法の別の形態は、インスタンス化 タスク=asyncio.ensure_future(C) #コルーチンオブジェクトはイベントループ・オブジェクトに登録され、オブジェクトはイベントループを開始する必要 位イベントループオブジェクトの最初の引数は、障害物が自動的に実行されるオブジェクトの後ろにある遭遇するように第一オブジェクトの端部は、イベントループは、オブジェクトに通知し、イベントループは最初のオブジェクトをオブジェクトと、継続するブロックしている非同期の効果を達成するように loop.run_until_complete(タスク)
タスクにバインドされた2コールバックオブジェクト
インポートASYNCIOは 非同期DEFの要求(URL): 印刷(「要求されたURL 」) を印刷(「成功ダウンロード」) の戻りURLの #のコールバック関数は、パラメータを持っている必要があります:タスクのタスクオブジェクト[] #のtask.result():タスクオブジェクトのカプセル化を関数の戻り値に対応する物体内部の特殊なコルーチン DEF コールバック(タスク): 印刷(「このコールバックがある」) を印刷(task.result()) C =要求は、(「www.baidu.com 」) #は、タスクを作成します。オブジェクトの タスク=asyncio.ensure_future(C) #コールバック関数を結合するタスクオブジェクトへ task.add_done_callback(コールバック) #は、イベントループのターゲットインスタンス ループ= asyncio.get_event_loop() #はイベントループオブジェクトにオブジェクトを同時駆動し、開始する必要がありますイベントループは、オブジェクト loop.run_until_complete(タスク)
3.マルチタスク非同期コルーチン
インポートASYNCIO インポート時間 のURLを = [ ' www.baidu.com '、' www.sogou、COM '、' www.goubanjia.com ' ] START_TIME = time.time() 非同期DEFの要求(URL): 印刷(" 要求URL 「) #非同期コルーチンの事項をマルチタスクは、関連するコードは、非同期サポートしていません表示されないことができ、睡眠はサポートしていません #1 SLEEPを(2) のawaitのasyncio.sleep(2 ) 印刷(」成功ダウンロード" ) ループ =asyncio.get_event_loop() #のタスクリスト:防止するタスク・オブジェクトの複数の タスク= [] のための URL でのURL: C = 要求(URL) タスク = asyncio.ensure_future(C) tasks.append(タスク) loop.run_until_complete(asyncio.wait (手順)) 印刷(time.time() - START_TIME)
マルチ非同期タスクコルーチンの4.アプリケーション
#Aiohttp:ネットワークベースの非同期要求のサポートモジュール インポートaiohttp インポートASYNCIO インポート時間 れるURL = [ 「http://127.0.0.1:5000/jay 」、 「http://127.0.0.1:5000/bobo 」、 ' http://127.0.0.1:5000/tom ' 、] START_TIME = time.time() 非同期DEF get_pageText(URL): aiohttp.ClientSession(と非同期)S AS:#1 要求されたオブジェクトのインスタンスは s.get待つと非同期(async)(応答としてURL): page_text = のawaitのresponse.text() プリント(page_text) #戻り値は、コールバック関数がデータ解析に使用するため のリターンpage_text #のデータ分析のためにパッケージコールバック関数 DEF 構文解析(タスク): #1のデータ取得対応 page_text = task.reault() プリント( + page_text ' 今後のデータ解析... ' ) #次の解析操作 のタスク = [] のための URL でのURL: C = get_pageText(URL) タスク = asyncio.ensure_future(C) #タスクオブジェクトデータバインディングのためのコールバック関数へ解決 (パース)task.add_done_callback tasks.append(タスク) ループ =asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(タスク)) プリント(time.time() - START_TIME)