PythonのGILロック - Pythonのロック機能は、プロセス内の一つだけのスレッドがCPUスケジューリングすることができ、同じ時間を保証することで、グローバルインタプリタロックを構築しました。 これはなぜGILロックですか? A:言語の発達における創始Python言語、迅速に開発言語オブジェクト、結合された場合にGILロック(C言語ロッキング)、
スレッド間の切り替えにバイト命令に応じてスイッチ100。
ロック:ロック
1、一度入れ
threading.Lock
スレッドセーフな、マルチスレッド操作、すべてのスレッドが内部処理をラインアップします。以下のような:リスト/ dictの/キュー = +人間の安全でないリニア「処理キュー
輸入スレッド V = [] DEF FUNC(引数): v.append(アルギニン)#のスレッドの安全性の 印刷(V) 用 I におけるレンジ(10 ): T = threading.Thread(目標= FUNC、引数= (I)) t.start()
輸入スレッドの インポート時 V = [] ロック = threading.Lock() デフFUNC(引数): lock.acquire() v.append(引数) time.sleep( 0.01 ) M = V [-1 ] プリント(引数、M) lock.release() 用 I における範囲(10 ): T = threading.Thread(目標= FUNC、引数= (I)) t.start()
輸入スレッドの インポート時 V = [] ロック = threading.RLock() デフFUNC(引数): lock.acquire() lock.acquire() #のRLOCKが複数回ロックすることができます v.append(引数) time.sleep( 0.01 ) M = V [-1 ] プリント(引数、M) lock.release() #のロック解除しRLOCK数回 lock.releaseを() 用 I における範囲(10 ): T = threading.Thread(目標= FUNC、引数= (I)) t.start()
2、一度Nを予め入れ
BoundedSemaphore
インポート時の インポートスレッド ロック = threading.BoundedSemaphore(3)は、 #3は、プロセスの指定された数を解放することである DEF FUNC(アルギニン): lock.acquire() 印刷(引数) time.sleep( 1 ) lock.release() 用 I における範囲(20 ): T = threading.Thread(目標= FUNC、引数= (I)) t.start()
3、Nの放出
調子
インポート時の インポートスレッド ロック = threading.Condition() ############### ##############方法A '' ' デフFUNC(引数): 印刷(「スレッドが来ました」) lock.acquire() lock.wait()#ロック 印刷(引数) time.sleep(1) lock.release() (10)の範囲内のiについて: T = threading.Thread(目標= FUNC、引数=(I)) t.start() 真の中に: INP = INT(入力( '>>>')) lock.acquire() lock.notifyは(INP)#)が(数、lock.waitを入力し複数のスレッドの解放を表すためにあります lock.release() 第二の方法############## ############### デフXXXX(): 印刷(「機能を実行」) 入力( ">>>") #のCt = threading.current_thread()#取得現在のスレッド #ct.getName() 真を返します デフFUNC(引数): 印刷(「スレッドが来ました」) lock.wait_for(XXXX)#xxxxの実行が完了したものを、このスレッドは、その後下がるのを待った後、 印刷(引数) time.sleep(1) (10)の範囲内のiについて: T = threading.Thread(目標= FUNC、引数=(I)) t.start()
4、一度すべてを置きます
イベント
インポート時の インポートスレッド ロック = threading.Event() DEF FUNC(アルギニン): 印刷(' スレッドが来ます' ) lock.wait() #ロック:レッド 印刷(アルギニン) 用 I における範囲(10 ): T = threading.Thread(目標= FUNC、引数= (I)) t.start() 入力(" >>>> " ) lock.set() #グリーン lock.clear() #は再び赤くなります 用 I における範囲(10 ): T = threading.Thread(目標= FUNC、引数= (I)) t.start() 入力(" >>>> " ) lock.set()
要約したもので
スレッドセーフ、スレッドセーフリストや辞書を。 なぜロック? - 非スレッドセーフ - コードのピースの制御