### 9.8コルーチン :プロセス、スレッド間の差は、3コルーチン - プロセス:リソース割り当ての最小単位 - スレッド:CPUが実行の最小単位である - コルーチン:ユーザレベルを、我々自身の書込みはPythonコードでオペレーティングシステムの切り替えを制御することが表示されていない コルーチンの意味:`` `Pythonの #はCPythonインタプリタで-コルーチンとスレッドがCPUの上で順番に実行され、マルチコアを活用することができます #あなたが使用することはできませんので、それ自体がマルチスレッドマルチコア #そうでも開いて、複数のスレッドが唯一のCPU上で実行有効にすることができます #のすべてのタスクが回避されている場合はコルーチンIO操作は、唯一のCPUの動作を使用する必要がある #はコルーチンを行うことができることを意味します高いCPU使用率の問題の影響 ` マルチスレッド及び関連プロセス:` ``のPython #のスレッドスイッチがオペレーティングシステムの大にオペレーティングシステム、大きなオーバヘッド、オペレーティング・システム制御不能な圧力を必要と #のIOオペレーションのOS認識より敏感 #のコルーチンスイッチは、制御可能なユーザー操作は、上の圧力増加しないオペレーティング・システムのPythonコードのオーバーヘッドが小さい必要 #のIO動作を知覚することができるようにユーザレベルが比較的低いです 注:私たちは、コルーチンは唯一我々はIO操作を認識することができます切り替えることができます書いたが、IO操作がまだスレッドに頼る必要は知覚できない `` ` #### 9.8.1 geventモジュール ` `` Pythonの インポート時 のインポートgevent から gevent インポートサル#は時間モジュールgeventモジュールを知らないだろう、これは識別するのに役立ちます (monkey.patch_all)を DEF (EAT): 印刷(' liujia食べるが、IS ' ) (time.sleep。1 ) 印刷(' 完成liujiaはEAT ' ) DEF SLEEP( ): 印刷(' liudanni SLEEPはIS ') time.sleep( 1 ) プリント(' finised liudanni ' ) G1 = gevent.spawn(EAT) #は、コルーチンタスクがIO操作が自動的に切り替わり遭遇作成 G2 = gevent.spawn(SLEEP) g1.join() #の閉塞をタスクは、それがスイッチバックしません切り替えG1をブロックすることなく完了するまで g2.join() gevent.joinall([G1、G2]) #はにブロックするようにブロックするために統一されます 印刷(g1.valueを) #結果の取得 #をオープン10コルーチン G_L = [] のための I INRANGE(10 ): G = gevent.spawn(EAT) g_l.append(G) gevent.joinall(G_L) ` #### 9.8.2 asyncioモジュール `` `Pythonの #タスクを開始する 非同期DEFデモ(): #のコルーチン方式の 印刷(' スタート' ) のawaitのasyncio.sleep( 1)#1 閉塞の 印刷(' 終了' ) ループ = ASYNCIO .get_event_loop() #は、時間のループ作成 loop.eun_until_complete(デモ()) #実行するデモタスクスローサイクルタイム `` ` ` `` Pythonの #は、複数のタスクを穴を掘る、とをノーリターン値 非同期DEFのデモ() : #コルーチン方式の 印刷("開始' ) のawaitのasyncio.sleep( 1) #1 閉塞 印刷(' 終了" ) ループ = asyncio.get_event_loop() #イベントループ作成 wait_obj = asyncio.wait()[デモ()、デモ()、デモを()] loop.run_until_complete(wait_obj) `` ` ` `` Pythonの #の開始と複数のタスクに戻り値がある 非同期DEFデモ(): #のコルーチン方式の 印刷(' スタート' ) (のawaitのasyncio.sleep。1) #の閉塞の 印刷(" 終了' ) を返す 123 ループ = asyncio.get_event_loop() T1 = loop.create_task(デモ()) T2 = loop.create_task(デモ()) タスク = [T1、T2] wait_obj = asyncio.wait([T1、T2]) loop.run_until_complete(wait_obj) のためにトンでタスク: プリント(t.result()) `` ` ` ``のpython #谁先回来先取谁的结果 輸入asyncio 非同期デフデモ(I): #协程方法 印刷(" スタート") (asyncio.sleepを待つ 10-I) #阻塞 プリント(' 末端' ) リターン I、123 非同期DEF :メイン() task_l = [] のための I における範囲(10 ): タスク = asyncio.ensure_future(デモ(I) ) task_l.append(タスク) のために RET にasyncio.as_completed(task_l): RESの =は待つRET プリント(RES) ループ = asyncio.get_event_loop() loop.run_until_complete(メイン()) `` `