Day10-4【Python 进程和线程】多线程:数据共享与隔离的奇妙世界:ThreadLocal来拯救你

在多线程编程的“无聊世界”中,数据共享和线程隔离就像是冰与火的对立面。你既想让多个线程共享数据,又希望它们互不干扰。就像是一个超级英雄在拯救世界时,不希望每个英雄都拿到相同的装备,但又得保证他们有适合自己的武器。

 

6e36fea68c7f5cb914eb35f02f47f04e.jpeg

 

想象一下:如果你有一堆“学生”,每个线程处理一个学生,局部变量肯定最好,因为它只有线程自己能看到,不会去影响别人。但是,问题来了!每次你都要把学生对象从一个函数传递到另一个函数,这样一层一层的传递,真是烦死人了!

如果每个函数都要传递 std(学生对象),那你不就变成了“传递专家”吗?甚至有可能一不小心成为了数据传递的“奴隶”!让我们先来看看这段无聊的代码:

pythondef process_student(name):    std = Student(name)    do_task_1(std)    do_task_2(std)
def do_task_1(std):    do_subtask_1(std)    do_subtask_2(std)
def do_task_2(std):    do_subtask_2(std)    do_subtask_2(std)

 

每个函数都要传递 std,一遍遍地递归传递。多麻烦呀!用全局变量存储学生对象?嗯,好像也不行,因为每个线程在处理不同的学生对象时,不能共享一个全局变量。

但如果我们使用一个全局字典(global_dict)来存放每个线程的学生对象,并让每个线程通过自己作为 key 来查找对应的学生对象呢?理论上是可行的,但这种做法有点“土”。代码会变得有点“丑陋”——你得不停地查找字典,工作量增加不说,代码的可读性也差了。

 

一、为何不要做“字典查找的搬运工”?

你也许会想:“字典查找这种小事我能轻松搞定啊!”但是,当你需要大量线程频繁地查找自己的学生对象时,你会发现——这是一种纯粹的“骚操作”。多麻烦呀!怎么办?

那就让我们迎来“救世主”——ThreadLocal!

ThreadLocal,简单说,就是为每个线程绑定一个“独立的数据副本”。每个线程都能拥有自己的数据副本而不会相互干扰。就像你每次去咖啡厅,店员给你一杯独立的咖啡,你可以享受自己的咖啡,而不担心别人拿到的是你要的那杯。

 

二、ThreadLocal的神奇用法

来,看看这个简化版的“数据拯救之术”——ThreadLocal。它像一个有魔法的dict,但每个线程只能访问自己的那一份数据。看完这段代码,你会明白什么叫做“简单又强大”:

pythonimport threading
# 创建全局ThreadLocal对象:local_school = threading.local()
def process_student():    # 获取当前线程关联的student:    std = local_school.student    print('Hello, %s (in %s)' % (std, threading.current_thread().name))
def process_thread(name):    # 绑定ThreadLocal的student:    local_school.student = name    process_student()
t1 = threading.Thread(target= process_thread, args=('Alice',), name='Thread-A')t2 = threading.Thread(target= process_thread, args=('Bob',), name='Thread-B')t1.start()t2.start()t1.join()t2.join()

 

执行结果:​​​​​​​

cssHello, Alice (in Thread-A)Hello, Bob (in Thread-B)

 

三、怎么理解这个魔法?

  • local_school 是一个 ThreadLocal 对象,每个线程可以通过它来存取自己的 student 属性。

  • 每个线程都有独立的 student 变量,它们互不干扰。所以,Thread-A 可以看到 Alice,而 Thread-B 看到的则是 Bob

  • ThreadLocal 让你再也不需要去“丑陋”地查找字典,所有线程自动拥有各自的数据副本。简直是拯救了编程世界!

四、用途

  • 每个线程的独立数据副本,想用就用!

  • 可以用于存储数据库连接、用户身份信息、HTTP请求等。这种方式让每个线程都可以轻松地访问自己的资源,简直是多线程编程的“神器”。

*小结

ThreadLocal 不仅仅是为了解决数据传递的问题,它通过为每个线程绑定独立的变量,成功避免了数据竞争和锁的麻烦。简直是多线程编程中的“超级英雄”!更妙的是,你不再需要担心全局变量的锁问题——每个线程都有自己的“专属”数据。

所以,下次在多线程编程时,不要再让你的数据在函数之间“飘来飘去”,使用 ThreadLocal,让每个线程拥有独立的数据副本,让你轻松搞定线程隔离问题!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值