threading.local()如何实现线程间的数据隔离?
- 内容介绍
- 文章标签
- 相关推荐
本文共计453个文字,预计阅读时间需要2分钟。
在一个多线程的进程中,多个线程可能会共享数据。为了保证数据的安全性,多线程通常会对写操作进行加锁。在多线程模型下,加锁也会导致效率降低。使用`threading.local()`可以为每个线程创建一个独立的局部队列,从而避免全局数据的共享,并确保线程安全。这样,每个线程都可以有自己的局部变量,不需要加锁操作。
同一个进程下,多个线程是共享进程的数据,多线程为了保证数据的安全性,多线程的写操作会加锁,加锁也就意味着多线程模型下,效率将降低。
threading.local()可以为每个线程创建局部名称空间,threading.local()是全局的,所有的线程都能访问,但是放入threading.local()对象中的属性数据不会被其它线程干扰.
未使用threading.local:
import threadingimport time
local = threading.local()
def set(i):
# local.i = i
print('设置数字', threading.current_thread().name, i)
time.sleep(1)
get()
def get():
print('取到数据', i)
if __name__ == '__main__':
for i in range(3):
t = threading.Thread(target=set, args=(i, ))
t.start()
结果,所有线程get拿到的是线程Thread-3 set的值
使用thread.local:
import threadingimport time
local = threading.local()
def set(i):
local.i = i
print('设置数字', threading.current_thread().name, local.i)
time.sleep(1)
get()
def get():
print('取到数据', local.i)
if __name__ == '__main__':
for i in range(3):
t = threading.Thread(target=set, args=(i, ))
t.start()
放到thread.local中的属性是隔离的,互不干扰
本文共计453个文字,预计阅读时间需要2分钟。
在一个多线程的进程中,多个线程可能会共享数据。为了保证数据的安全性,多线程通常会对写操作进行加锁。在多线程模型下,加锁也会导致效率降低。使用`threading.local()`可以为每个线程创建一个独立的局部队列,从而避免全局数据的共享,并确保线程安全。这样,每个线程都可以有自己的局部变量,不需要加锁操作。
同一个进程下,多个线程是共享进程的数据,多线程为了保证数据的安全性,多线程的写操作会加锁,加锁也就意味着多线程模型下,效率将降低。
threading.local()可以为每个线程创建局部名称空间,threading.local()是全局的,所有的线程都能访问,但是放入threading.local()对象中的属性数据不会被其它线程干扰.
未使用threading.local:
import threadingimport time
local = threading.local()
def set(i):
# local.i = i
print('设置数字', threading.current_thread().name, i)
time.sleep(1)
get()
def get():
print('取到数据', i)
if __name__ == '__main__':
for i in range(3):
t = threading.Thread(target=set, args=(i, ))
t.start()
结果,所有线程get拿到的是线程Thread-3 set的值
使用thread.local:
import threadingimport time
local = threading.local()
def set(i):
local.i = i
print('设置数字', threading.current_thread().name, local.i)
time.sleep(1)
get()
def get():
print('取到数据', local.i)
if __name__ == '__main__':
for i in range(3):
t = threading.Thread(target=set, args=(i, ))
t.start()
放到thread.local中的属性是隔离的,互不干扰

