【Python之Flask框架】Day2
一、课前预习
1.1 threading Local()函数用法:返回线程局部变量
local() 函数创建的变量看似全局变量(可以被各个线程调用),但各线程调用的都是该变量的副本(各调用各的,之间并无关系)。可以这么理解,使用 threading 模块中的 local() 函数,可以为各个线程创建完全属于它们自己的变量(又称线程局部变量)。正是由于各个线程操作的是属于自己的变量,该资源属于各个线程的私有资源,因此可以从根本上杜绝发生数据同步问题。
threading.local()
:可以实例化出一个寄存柜,这个寄存柜是全局化的
寄存柜对象.你想放的东西名字 = 东西
:你可以在线程中这样放入一个独有的物件
寄存柜对象.你放过的东西的名字
:这样,你就可以将你存放进的东西拿出来。注意,只有你才能拿出来,其他人拿不了。
基本概念:同一进程内的内存栈是全局的。
threading.local本质上是对全局字典对象管理类的一个封装,
内部自动为每个线程维护一个空间(字典),用于当前存取属于自己的值。保证线程之间的数据隔离。
主要的目的是线程之间的数据隔离。
当然,自己写也不是不可以,但开发的一个宗旨是不必重复造轮子。
案例源码:
import time
import threading
local = threading.local()
def func(n):
print(threading.current_thread())
local.val = n
time.sleep(2)
print(n)
for i in range(10):
t = threading.Thread(target=func,args=(i,))
t.start()
实质上local.val = n等效于local._local__impl.dicts[‘thread_id’][‘val’] = n
另外需要注意的是local类重写了取值方法。
总结:无论是使用线程局部变量,还是使用互斥锁机制,其根本目的是为了解决多线程访问公共资源时可能发生的数据同步问题。互斥锁机制实现的出发点是,在各线程仍使用公共资源的前提下,想办法控制各个线程对该资源的同时访问;而线程局部变量则另辟蹊径,直接令多线程操作各自的私有资源,从根本上杜绝了同时访问所带来的数据同步问题。
需要说明的一点是,线程局部变量的解决方案,并不能完全替代互斥锁同步机制。同步机制是为了同步多个线程对公共资源的并发访问,是多个线程之间进行通信的有效方式;而线程局部变量则从根本上避免了多个钱程之间对共享资源(变量)的竞争。
那么,这两种解决方案该如何选择呢?简单来说,如果多线程之间需要共享资源(如多人操作同一银行账户的例子),就使用互斥锁同步机制;反之,如果仅是为了解决多线程之间的共享资源冲突,则推荐使用线程局部变量。
参考文章:https://www.cnblogs.com/insane-Mr-Li/p/12092029.html
https://my.oschina.net/u/4347380/blog/4334024
进阶:https://blog.youkuaiyun.com/weixin_43116910/article/details/88754349
1.2 functools.partial()
定了某个参数的值,使原来的调用少传一个参数。但是我们可能有某种函数场景,它的参数是也一个函数,比如回调函数。
这种可以解决回调函数是show的情况,但是如果回调函数是别的呢?fly(h), eat(), run(date), 等等, 这种函数的参数你无法预知,你也不知道调用方会怎么调用,所以这时就可以使用 functools.partial 来生成一个新的函数。
这样就可以在调用方自己来控制了函数的参数了。
1.3 functools.wraps()
functools 官方文档:https://docs.python.org/zh-cn/3/library/functools.html
参考:https://www.cnblogs.com/su-sir/p/12516224.html
wraps函数:避免多个函数被两个装饰器装饰时就报错,因为两个函数名一样,第二个函数再去装饰的话就报错,最好是加上这个,代码更加健壮
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和函数属性。
1.4 python–面向对象封装
参考:https://www.cnblogs.com/plf-Jack/p/11051933.html