实际案例:
我们实现了一个web视频监控服务器,服务器端采集摄像头数据,客户端使用浏览器通过http请求接收数据。服务器使用推送的方式(multipart/x-mixed-replace)一直使用一个tcp连接向客户端传递数据。这种方式将持续占用一个线程,导致单线程服务器无法处理多客户端请求。
改写程序,在每个线程中处理一个客户端请求,支持多客户端访问。
解决方案:
threading.local函数可以创建线程本地数据空间,其下属性对每个线程独立存在,多个线程之间都是不干扰的。
2、代码演示线程本地数据的简单使用
import threading
# 创建线程的本地数据
l = threading.local()
# 对l任意添加一个属性它都是线程的本地数据,
# x就是主线程的本地数据,其它线程访问不到l下的x
l.x = 1
def f():
print(l.x)
# 在本线程调用x
f()
# 在子线程中运行f()
# threading.Thread(target=f).start()
# 可以看到抛出一个异常找不到x属性,所有在子线程中使用l也是访问不到x的。
# AttributeError: '_thread._local' object has no attribute 'x'
# 修改f(),让他对进行l.x修改
def f2():
l.x = 5
# 启动子线程运行f2
threading.Thread(target=f2).start()
# 在主线程中再访问l.x,可以看到还是没有改变还是1,说明每个线程x它是独立的
print(l.x)



