プロセス、スレッド、コルーチン:並列性を達成するための手段
CPythonのインタプリタで、本当に同時に複数のCPUの使用を複数のスレッドを活用する方法がない、マルチスレッド他の言語問題なし
コルーチンは、基本的に複数のタスク間のIOスイッチにいくつかの時間を節約することができ、スレッド(偽スレッド)であり、
コルーチン:コードレベルのスイッチング、およびレジスタ・スタックを必要としません
タスクの切り替えは、時間がかかりますが、スレッド間の切り替えのプロセスよりもはるかに少ないです
greetlet:本当のコルーチンモジュールがハンドオーバーを完了するために使用されるgreetlet
コルーチンCPUは、当社独自のプログラムコード補完、プロセスとスレッドのスケジューリングは、オペレーティング・システムによって行われることで、スケジュールされていません
モジュールIO操作を認識することができますがコルーチンた場合のみ、プログラムは、同時実行のための効果をタスクスイッチを実行します
同じスレッドでタスク
スレッドでの並行処理の効果の概念:コルーチン
コルーチン:爬虫類と関連したネットワークプログラミングソケット
#プロセスは、オペレーティングシステムによる複数のプロセス工程の間に開始された呼び出しを担当 #スレッドは、実際にはCPUによって実行される複数のスレッドの最小単位は、実際にスレッドされる開始 #スレッドがスレッドのスタックレジスタ作るオープン #はスレッド閉じ #のコルーチンの 本質的に位スレッドされて #は、いくつかのIO時間を節約するために、複数のタスクを切り替えることができ 、タスク#協会プロセスの切り替えも時間を消費しますが、コストは、スレッド、プロセス間の切り替えよりもはるかに小さい の#同時実行手段 #インポート時間 消費者DEF番号(): # しばらく真: #X = 降伏 #time.sleep(1。 )# 印刷(' 処理されたデータ:' 、X) #の #のDEFプロデューサー(): #C = 消費者() #次(C ) # 用 I でレンジ(10 ): #time.sleep(1。 )# 印刷(' 本番データ:' 、I) #1 c.send(I) # # プロデューサー() #本当のコルーチンモジュールは、ハンドオーバgreenletを完了するために使用される #をからgreenletインポートgreenlet #DEF EAT(): #印刷(' スタートを食べる' ) #G2の。スイッチ() #印刷(' 食べて終わり' ) #G2の。スイッチ() #1 )(DEF再生#を: #印刷(「スタートを再生" ) #g1を。スイッチ() #印刷(' エンドをプレイ' ) #G1 = greenlet(食べる) #g2を = greenlet(遊び) #g1を。スイッチ() #からgeventインポートサル; monkey.patch_all() #インポート時 #インポートgeventの #インポートスレッド #DEF食べる(): #プリント(threading.current_thread()のgetName()。) #プリント(threading.current_thread() ) #印刷(' スタートを食べる' ) #time.sleep(1 ) #印刷(「エンドを食べます' ) #1 #DEF再生(): #印刷(threading.current_thread()。関連項目GetName()) #印刷(threading.current_thread()) #印刷(' スタートを再生する' ) #time.sleep(1。 )# 印刷(' エンドプレイ" ) #の #のG1 = gevent.spawn(EAT) #g2を = gevent.spawn(プレイ) #1 g1.join() #g2.join() #タスク切替処理と右のオペレーティング・システムのスレッド完了するために #のコルーチンタスクを、のみ遭遇コルーチンモジュールはIOオペレーションを認識プログラム(コード)との間で切り替えることにより、プログラムは、タスク切り替え、同時実行効果実行する #同期および非同期 位から #インポートGEVENTの #(monkey.patch_all; GEVENTインポートモンキー) #インポート時間 #1 DEFタスク(N): #1 time.sleep(1 ) #プリント(N) # #DEF同期(): # ための I における範囲(10 ): #タスク(I) #1 #のデフ非同期(): #g_lst = [] # するための I における範囲(10 ): #G = gevent.spawn(タスク、I) #1 g_lst.append(G) #1 gevent.joinall(g_lst)#ための G におけるg_lst:g.join() #シンク( ) #の非同期() #のコルーチンは:1つのスレッドのコンセプトで同時効果を可能 なタスクIOオペレーションの一部を回避することができ# 別のタスクに、タスクの実行中に#を検出したIOスイッチを #マルチスレッド弱体化されて #協会スレッド使用率に関するCPUの改良されたプロセス 、マルチスレッドの高速スイッチングに比べて#のコルーチン効率利点 #クローラー例えば プロセス待機#IO要求 位からGEVENTインポート猿; monkey.patch_all() #インポートGEVENT #からurllib.request urlopen#インポート内蔵モジュール #DEF GET_URL(URL): #レスポンス = urlopen(URL) #コンテンツ。response.read =()のデコード('UTF-8 ' ) #の リターンLEN(コンテンツ) #1 # G1= gevent.spawn(GET_URL、' http://www.baidu.com ' ) #のG2 = gevent.spawn(GET_URL、' http://www.sogou.com ' ) #1 G3 = gevent.spawn(GET_URL、' http://www.taobao.com ' ) #G4 = gevent.spawn(GET_URL、' http://www.hao123.com ' ) #G5に = gevent.spawn(GET_URL、' HTTP://www.cnblogs。 COM ' ) #1 gevent.joinall([G1、G2、G3、G4、G5]) #プリント(g1.value) #プリント(g2.value) #プリント(g3.value) #プリント(g4.value) #プリント(g5.value) #のRET= GET_URL(' http://www.baidu.com ' ) #プリント(RET) #ソケットサーバ
コルーチンは、サーバーを達成しました
monkey.patch_all(); gevent輸入サル 輸入ソケット 輸入gevent :defの話(CONN) conn.send(B ' こんにちは' ) プリント(conn.recv(1024).decode(' UTF-8 ' )) はconn.close () SK = socket.socket() sk.bind((' 127.0.0.1 '、8080 )) sk.listen() しばらく真: CONN、ADDR = sk.accept() gevent.spawn(講演、CONN) SK。閉じる()
クライアント:
インポートソケット SK = socket.socket() sk.connect((' 127.0.0.1 '、8080 )) 、印刷(sk.recv(1024 )) MSG =入力(' >>> ').encode(' UTF-8 ' ) sk.send(MSG) sk.close()