threading.local特徴:
あなたは(スレッドIDに基づいて固定値)の値にアクセスできるように、スレッドごとに①オープンスペース、
何threading.localを②flaskないが、コンテキスト管理フラスコのアイデアはthreading.local参考のためのものです。
③終値の前にスレッドが値をクリアした後に同じ、スレッドは閉じたまま。
通常のマルチスレッド
インポート時間 インポートスレッド クラスはFoo(オブジェクト): デフ __init__ (自己): self.num = 0 VAL2 = フー() デフタスク(I): val2.num = I time.sleep( 1 ) プリント(val2.num) 用 I における範囲(4 ): T = threading.Thread(目標=タスク、引数= (I)) )t.start( 结果: 3 3 3 3 4个值全一样
threading.localマルチスレッディング
インポート時 のインポートスレッディング #時に各スレッドの実行val1.xx = 1、内部スレッドは、この目的のためにスペースを開きます1 = xxを保存するために #自分の店xxをピックアップしてval1.xxを、このスレッドに独自のメモリアドレスを見つける VAL1を= threading.local() DEF タスク(I): val1.num = I time.sleep( 1 ) プリント(val1.num) 用 I における範囲(4 ): T threading.Threadの=(目標=タスク、引数= ( I)) t.start 出力: 0 1 2 3件 の異なる4つの結果
カスタムthreading.local
インポートスレッドは "" " ストレージ= {#カスタムような辞書を維持 { 'X1':0}、1111 1112:{ 'X1' :.} 1 1113:{ 'X1':} 2 1114:{「X1を':3} 1115:{' X1「:4} } "" " クラスローカル(オブジェクト): DEF __init__ (自己): 物体__setattr__(セルフ、' ストレージ' 、{}) DEF __setattr__ (セルフ、キー、値): IDENT = threading.get_ident() #これは、上述したID上記スレッドである IF IDENT でself.storage。 self.storage [IDENT] [キー]= 値 他: self.storage [IDENT] = {キー:値} DEF __getattr__ (自己、項目): IDENT = threading.get_ident() #这个就是线程ID 場合 IDENT ない でself.storage: リターンリターンself.storage [ IDENT]に.get(アイテム) 局所 = ローカル()DEF タスク(引数): local.x1 = argに プリント(local.x1)用 I における範囲(5 ): T = threading.Thread(目標=タスク、引数= (I)) t.start()
输出:
0
1
2
3
4
出力はあなたの別のスレッドのIDに基づいて異なる値になります
強化されたカスタムthreading.local(フラスココンテキスト管理そう)
元のメンテナンスは、辞書や辞書であることがある: "" " ストレージ= { 1111:{ 'X1':0}、 1112:{ 'X1' :. 1} 1113:{ 'X1':2} 1114:{ 'X1' :} 3 1115:{ 'X1' :. 4} } "" " 拡張メンテナンス辞書のリストを追加することは、辞書である: " "" ストレージ= { 1111:{ 'X1':[0,1]}、 1112 :{ 'X1':[0,1,2]} 1113:{ 'X1':[0,1,3]} 1114:{ 'X1':[0,1,5]} 1115:{ 'X1' :[0,1,6]} } 「」 " リストがスタックへとして保持(値を使用する[あれば追記が、添加され -1 ]、値をポップすることによって奪われている場合)、LIFO使用されます インポートスレッディング "" " ストレージ= { 1111:{ 'X1':[]}、 1112:{ 'X1 ':[]} 1113:{' X1 ':[]} 1114:{' X1 ':[]} 1115:{' X1' :[]} 1116:{' X1' :[]} } ""」 クラスローカル(オブジェクト): デフ __init__ (自己): オブジェクト。__setattr__(自己、' ストレージ' 、{}) デフ __setattr__ (自己、キー、値): IDENT = threading.get_ident() もし IDENT でself.storage: self.storage [IDENT] [キー] .append(値) 他: self.storage [IDENT] = {キー:[値]} DEF __getattr__ (自己、項目): IDENT =threading.get_ident() もし IDENT ない でself.storage: リターンリターン self.storage [IDENT] [アイテム] [ - 1 ] 局所 = ローカル()DEF タスク(引数): local.x1 = argに プリント(local.x1)用 I における範囲(5 :) T = threading.Thread(目標=タスク、引数= (I)) )(t.start 输出:0 1 2 3 4