# 线程局部存储 thread_local_data = threading.local()
在Python中,线程中的变量作用域与普通的Python程序中的变量作用域是相似的,但在多线程环境中,需要注意线程间的数据共享和同步问题。以下是Python线程中变量的作用域概述:
-
全局作用域:
- 在模块级别定义的变量(即在所有函数和类之外定义的变量)在整个模块中都是可见的。
- 在多线程环境中,全局变量可以被所有线程访问和修改。这意味着如果一个线程修改了全局变量的值,其他线程会看到这个变化。
-
局部作用域:
- 在函数或方法内部定义的变量是局部变量,只在该函数或方法内部可见。
- 每个线程在执行函数时都有自己的局部变量副本,这些局部变量对其他线程不可见。
-
线程局部存储(Thread-Local Storage):
- 有时需要确保每个线程有自己独立的一套变量,不与其他线程共享。可以使用
threading.local()
来创建线程局部存储。 - 通过这种方式,在线程中存储的数据对其他线程是不可见的,确保线程安全。
- 有时需要确保每个线程有自己独立的一套变量,不与其他线程共享。可以使用
示例代码
import threading
# 全局变量
global_var = 0
# 线程局部存储
thread_local_data = threading.local()
def thread_function(name):
# 局部变量
local_var = name
# 线程局部变量
thread_local_data.thread_var = name
print(f"Thread {name}: global_var = {global_var}")
print(f"Thread {name}: local_var = {local_var}")
print(f"Thread {name}: thread_var = {thread_local_data.thread_var}")
# 创建多个线程
threads = []
for i in range(3):
t = threading.Thread(target=thread_function, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
# 修改全局变量
global_var = 10
# 再次创建多个线程
threads = []
for i in range(3):
t = threading.Thread(target=thread_function, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
输出结果
该示例展示了全局变量、局部变量和线程局部变量在多线程中的行为:
Thread 0: global_var = 0
Thread 0: local_var = 0
Thread 0: thread_var = 0
Thread 1: global_var = 0
Thread 1: local_var = 1
Thread 1: thread_var = 1
Thread 2: global_var = 0
Thread 2: local_var = 2
Thread 2: thread_var = 2
Thread 0: global_var = 10
Thread 0: local_var = 0
Thread 0: thread_var = 0
Thread 1: global_var = 10
Thread 1: local_var = 1
Thread 1: thread_var = 1
Thread 2: global_var = 10
Thread 2: local_var = 2
Thread 2: thread_var = 2
从输出可以看出:
- 全局变量在所有线程中共享,修改后所有线程都能看到最新值。
- 局部变量在每个线程中独立存在,互不影响。
- 线程局部变量在每个线程中独立存在,互不影响。