threading.local()如何实现线程间的数据隔离?

2026-05-21 14:131阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计453个文字,预计阅读时间需要2分钟。

threading.local()如何实现线程间的数据隔离?

在一个多线程的进程中,多个线程可能会共享数据。为了保证数据的安全性,多线程通常会对写操作进行加锁。在多线程模型下,加锁也会导致效率降低。使用`threading.local()`可以为每个线程创建一个独立的局部队列,从而避免全局数据的共享,并确保线程安全。这样,每个线程都可以有自己的局部变量,不需要加锁操作。

同一个进程下,多个线程是共享进程的数据,多线程为了保证数据的安全性,多线程的写操作会加锁,加锁也就意味着多线程模型下,效率将降低。

threading.local()如何实现线程间的数据隔离?

threading.local()可以为每个线程创建局部名称空间,threading.local()是全局的,所有的线程都能访问,但是放入threading.local()对象中的属性数据不会被其它线程干扰.


未使用threading.local:

import threading
import 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 threading
import 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()是全局的,所有的线程都能访问,但是放入threading.local()对象中的属性数据不会被其它线程干扰.


未使用threading.local:

import threading
import 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 threading
import 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中的属性是隔离的,互不干扰