PS:pythonの通訳、多くのがありますが、最も一般的なのは、CのPythonインタプリタであります
GILグローバルインタープリタロック:
GILの性質に排他ロックである:同時シリアルになる、データのセキュリティを確保するために、効率を犠牲に
実行の同じプロセスで複数のスレッド防止するために使用されると同時に(同じプロセス内で複数のスレッドが、同時達成するために、並行して達成することができません)
メモリ管理CのPythonインタプリタはスレッドセーフではありませんので、GILの存在があります
ガベージコレクション:
1、参照カウント
2、明確なラベル
3、世代回復
必要なポイントであれば協議の有用性のPythonのマルチスレッドの研究:
10S:計算集約4つのタスクを実行しながら、
#计算密集型 からマルチプロセッシングインポートプロセス からスレッドインポートスレッド #1 mport OSを、時間 DEF 動作(): のRES = 0 のための I における範囲(100000000 ): RES * = I なら __name__ == ' __main__ ' : L = [] 印刷(os.cpu_count()) #为6机本核 =開始time.time() のために私に範囲を(6): #p =プロセス(目標=仕事)#耗时4.732933044433594 P =スレッド(目標=仕事)#耗时22.83087730407715 l.append(P) p.start() のための P におけるL: p.join() を停止 = time.time() 印刷(' 実行時間である%sの'%(ストップ・スタート))
シングルコアの例:
リソースを節約するためにオープンスレッドより
マルチコアの場合:
オープンなプロセス:10秒
オープンスレッド:40代
IO集約型のタスクが同時に4を実行します
#IO密集型 からマルチプロセッシングインポートプロセス からスレッドインポートスレッド インポート通し インポートOSは、時間 DEF )(動作: time.sleep( 2 ) もし __name__ == ' __main__ ' : L = [] プリント(os.cpu_count()) #本机为6は核 =開始time.time()の ための I における範囲(4000 :) P =プロセス(目標=仕事)#9.001083612442017s時間がかかり、より多くの、ほとんどの時間は、作成プロセスに費やさ #2.051966667175293sマルチかかるのp- =スレッド(ターゲット=作品)# l.append(P-) p.start() のための p型でLを: p.join() STOPは = time.time() 印刷(' RUN時間がS%'%(スタート-STOP))
シングルコア:オープンスレッドより省資源
マルチコア:オープンスレッドより省資源
イベントイベント:
スレッディングインポートイベント、スレッド のインポート時 #イベントオブジェクトへの氏 E = イベント() DEF ライト(): 印刷(「赤点灯のn 」) time.sleep( 3。 ) e.set() #シグナル を印刷(' 緑の光' ) DEF CAR(名): 印刷(' %Sは、赤色光である'%の名称) e.wait() #のウェイト信号 を印刷(' レースの%S燃料ドア'%名) T =スレッド(目標= 光) t.start() のための I における範囲(10 ): T =スレッド(目標=車、引数=(' 伞兵%S '%I)) t.start()
セマフォ:知識の異なる点に対応するさまざまな分野で
ミューテックス:トイレ(ピット)
セマフォ:公衆トイレ(ピットビット)
スレッディングインポートセマフォ、スレッド のインポート時 のインポートランダム SM =セマフォ(5) #5ビットのピット含む構築された公衆トイレ DEF タスク(名前): sm.acquire() 印刷(「Sがピットビットを占め%'%の名前) time.sleep(random.randint( 1,3 )) ()sm.release 用 I における範囲(40 ): Tはスレッド(目標=タスク、引数= = (I)) t.startを()
デッドロック:
RLOCKは、連続的に取得し、人々をつかむために最初のロックを解除することができます
各ロックボディ・カウントは1だけインクリメントさ取得します
たびにロック解除ボディカウントをデクリメント
限りロックカウントをつかむことができる他のゼロではないよう
クラスMyThread(スレッド): DEFを実行(セルフ): #は、runメソッドでrunメソッドの呼び出しをトリガーに自動的にスレッドを作成して、自動的にトリガ関数func1とfunc2のと同等です self.func1() self.func2() DEFのfunc1の(自己を): mutexA.acquire( ) プリント(' %はSロックつかん'%をself.name) #self.name等価current_thread()。名 mutexB.acquire() プリント(' %SのBグラブロック'%self.name) mutexB。リリース() 印刷(' %S Bロック解除'%self.name) mutexA.release() を印刷(' %S Aロック解除'%self.name) DEFの関数func2(自己): mutexB.acquire() プリント(' %SのBグラブロック'%self.name) (time.sleep。1 ) mutexA.acquire( ) プリント(' %は、Sロックつかん'%を)self.name mutexA.release() プリント(' %Sロック解除'%self.name) mutexB.release() プリント(' %S Bロック解除"%self.name) のための I中範囲(10 ): T = MyThread() t.start()
再帰的ロック:
輸入スレッド クラスMyThread(threading.Thread): デフ(自己)を実行します。 グローバルN1、N2 lock.acquire() #加锁 N1 + = 1枚のプリント(self.name +は' にN1を設定する' + STR(N1)) ロック.acquire() #再次加锁 N2 + = N1 プリント(self.name +が' にN2を設定' + STR(N2)) lock.release() lock.release() N1、N2 = 0、0 ロック = threading.RLock() もし __name__ == ' __main__ ' : thread_list = [] のための I における範囲(5 ): T = MyThread() t.start() thread_list.append(T) のための T でthread_list: t.join( ) プリント(' 最終NUMた:%d、%D '%(N1、N2))