Threading.local

时间:2023-03-09 05:11:47
Threading.local

在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。

Threading.local可以创建一个对象,每个线程都可以对他读写属性,但不会互相影响

import threading
import time
# 创建全局ThreadLocal对象:
class A:
pass
# local_school = A()
local_school = threading.local() def process_student():
print('Hello, %s (in %s)' % (local_school.student, threading.current_thread().name)) def process_thread(name):
# 绑定ThreadLocal的student: local_school.student = name
time.sleep(2)
process_student()
a = []
for i in range(20):
a.append(threading.Thread(target= process_thread, args=(str(i),), name=str(i))) for i in a:
i.start()

通过字典以及面向对象中的魔法方法来自己实现一个

import time
from threading import get_ident,Thread
class PPP:
def __init__(self):
object.__setattr__(self,"storage", {})
def __setattr__(self, key, value):
if get_ident() in self.storage:
self.storage[get_ident()][key]=value
else:
self.storage[get_ident()] ={key: value}
def __getattr__(self, item):
return self.storage[get_ident()][item] p =PPP()
def task(arg):
p.a = arg
time.sleep(2)
print(p.a) for i in range(10):
t = Thread(target=task,args=(i,))
t.start()