event_loop:イベントループ、無限ループの等価な(ループ不明の回数)、私たちはイベントループにいくつかの特殊機能レジスタ(配置)を置くことができ、一定の条件が満たされたときに、関数が周期的に実行されます。手順は、最初から最後まで、設定された順序で実行され、実行の数は正確に設定されています。プロセスの一部が比較的長い時間のかかるを実行するためにバインドされている非同期プログラムを書くとき、私たちは、現在の制御プログラムを聞かせする必要があり、後ろに許可されたプログラムは、(ハング)を実行しているので、最初の起動および実行の他の部分です。プログラムは、メインプログラムの完了の背後で実行された場合も、速やかに、このプロセスに必要な次のステップが、時間が不確実であることができます完了したタスクを通知する必要がある、メインプログラムは、メッセージタスク完了の受信時に、継続的な監視状態を必要とします、我々は次のステップを開始します。それは、この連続ループモニタです。
コルーチン:中国語の翻訳がコルーチンと呼ばれているが、我々は多くの場合、Pythonでイベントループにコルーチンオブジェクトを登録することができ、協会のオブジェクト型に代わってプロセスを指し
、それはサイクルイベントを呼び出します。私たちは、あなたが呼び出したとき、すぐに実行されませんメソッドを定義するために非同期キーワードを使用し、することができます
が、コルーチンオブジェクトを返します。
タスク:さらにコルーチンオブジェクトにカプセル化されたタスクは、各タスクのステータスを含んでいます。
実際には、実行するために実行したりしないように今後の課題に代わって、タスクには本質的な違いはありません:未来。
また、我々はまた、それだけで、特にコルーチンを定義するために、Pythonの3.6から登場し、非同期/待つのキーワードを知っている必要があります。ここで、非同期コルーチンを定義し、保留中の実行をブロックするための方法を待っています。
インポートASYNCIO 非同期DEFの要求(URL): 印刷(' 要求されている:' 、URL) を印刷(' 成功をダウンロード:' 、URL) C =リクエスト(' www.baidu.com ' ) #最初のステップ:イベントの例環状オブジェクト ループ= asyncio.get_event_loop() #のステップ2:タスクオブジェクトを作成し、オブジェクトは、コルーチンのオブジェクトパッケージすることである 。#タスク= loop.create_task(C) 位にインスタンス化されたタスク・オブジェクトの方法の別の形態 =タスクをasyncio.ensure_future(c)の #はコルーチンオブジェクトがイベントループオブジェクトに登録されている、と私たちはループがオブジェクトのイベントを開始する必要が loop.run_until_completeを(タスク) #印刷タスクは、タスクオブジェクトの状態を見ることができます 印刷(タスク)
、コールバック関数をダウンクロール後のデータは、データを解析できるので、コールバックを結合、コールバック関数は、クローラーで使用されなければなりません
インポートASYNCIO 非同期DEFの要求(URL): 印刷(' 要求されている:' 、URL) を印刷(' ダウンロード成功:' 、URL) 戻りURLの #のコールバック関数のパラメータを持っている必要があります。タスク #1 task.resultを():オブジェクトのタスク目的関数の戻り値に対応するパッケージ内の特別なコルーチン DEFのcallbak(タスク): 印刷(「!このコールバックがある」) を印刷(task.result()) C =リクエスト(「www.baidu.com 」) #を与えますコールバック関数をバインドするタスクオブジェクト #は、 タスクオブジェクトを作成します =タスクasyncio.ensure_future(C) #結合コールバック task.add_done_callback(callbak) #時間周期登録 ループ= asyncio.get_event_loop() loop.run_until_complete(タスク)
マルチタスク非同期コルーチン
時間のインポートSLEEP インポートASYNCIO インポート時間 のURLを = [ ' www.baidu.com '、' www.sogou.com '、' www.goubanjia.com ' ] スタート = time.time() 非同期DEFの:リクエスト(URL) を印刷します(「要求されている:」、URL) #非同期コルーチン実装をマルチタスクを、関連するコードが非同期をサポートしていないことはできません。 #SLEEP(2) のawait asyncio.sleep(2 ) 印刷(' 成功をダウンロードしてください。'、URL) ループ = asyncio.get_event_loop() #のタスクリスト:タスクを複数配置することは、オブジェクト タスク= [] のための URL で:URLの C = 要求(URL) タスク = asyncio.ensure_future(C) tasks.append(タスク) ループ。 run_until_complete(asyncio.wait(手順)) 印刷(time.time() -スタート)
+シングルスレッド、マルチタスク非同期
#のインタビューの質問は、どのようにクロールの効率向上に #を、大容量メモリを占めるデータのデータ量:矢印を使用して #のaiohttpを:モジュールベースのサポート非同期ネットワークが要求 #と機能アプリケーションモジュールの要求が同じで、違いは非同期サポートすることです #のPIP aiohttpをインストール インポート要求 のインポートASYNCIO インポート時間 インポートaiohttp #はスレッド+マルチタスク非同期コルーチン のURL = [ 「http://127.0.0.1:5000/jay 」、 「http://127.0.0.1:5000/bobo 」、 " HTTP ://127.0.0.1:5000 /トム" ] #の非同期効果、経験のブロッキング、他のタスクの実行ハングブロック #のエージェント業務を: #await s.get非同期(URL、プロキシ= "HTTPポート:// IP")と:応答として 非同期DEF get_pageText(URL): #1 no閉じるリソースと要求オブジェクト、 aiohttp.ClientSession(と非同期)S AS: :待つ非同期(URL)応答ASとs.get #テイク応答データがそれほど待つ必要がブロックされる可能性があり、この方法は、テキストで、リクエストメソッドがあるテキスト page_text = のawaitのresponse.text() #データ分析に応じて、コールバック関数によって、運転 復帰page_text #のデータ解析のためのパッケージのコールバック関数 DEF 解析(タスク): #1。応答データをフェッチ page_text = task.result() 印刷(page_text + 「今後のデータ分析!」) #の書き込み位置における解析動作 スタート = time.time() タスク = [] のための URL で:URLの C = get_pageText(URL) タスク = asyncio.ensure_future(C) #データ分析のためのタスク・オブジェクト・コールバック・バインディングに タスクを.add_done_callback(パース) tasks.append(タスク) ループ = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(手順)) 印刷(time.time() -スタート)