スレッド内のグローバル変数-ThreadLocal
各スレッドに値で機能のみを使用し、変数の値を取得しますが、マルチレベルの機能のために、パラメータ渡しはあまりにも面倒です
ThreadLocalのソリューション
import threading local_school = threading.local() def process_student(): # 获取当前线程关联的studnet std = local_school.student # 对当前线程的全局变量拥有修改权 local_school.student = 'my'+local_school.student print("hello, %s (in %s)" % (std, threading.current_thread().name)) def process_stu(): # 对当前线程的全局变量拥有修改权 std = local_school.student print("hello, %s (in %s)" % (std, threading.current_thread().name)) def process_thread(name): # 绑定ThreadLocal的studnet local_school.student = name process_student() process_stu() print(local_school.student) t1 = threading.Thread(target大专栏 线程全局变量ThreadLocaltor">=process_thread, args=('Alce',), name="Thread-A") t2 = threading.Thread(target=process_thread, args=('Bob',), name="Thread-B") t1.start() t2.start() t1.join() t2.join()
輸出
hello, Alce (in Thread-A) hello, myAlce (in Thread-A) myAlce hello, Bob (in Thread-B) hello, myBob (in Thread-B) myBob
分析
グローバル変数はThreadLocalをオブジェクトは、あなたがたが互いに独立して、書いて、各スレッドの学生の属性を読み取ることができlocal_schoolです。あなたはグローバル変数としてlocal_schoolことができますが、干渉することなく読み取ることができlocal_school.studentローカル変数がスレッドあるとして各属性は、それは管理の問題、ThreadLocalの内部ハンドルをロックしません。グローバル変数local_schoolだけでなくlocal_school.studentで、また他の変数、などlocal_school.teacherなどなどに結合することができ、辞書であるとして、それを理解することができます。
ハンドラスレッドへのすべての呼び出しが簡単にこれらのリソースにアクセスできるように、ThreadLocalの最も一般的な場所は、スレッドごとにデータベース接続、HTTPリクエスト、ユーザーのID情報を結合さ