【Python之Flask框架】Day2

【Python之Flask框架】Day2

一、课前预习

1.1 threading Local()函数用法:返回线程局部变量

local() 函数创建的变量看似全局变量(可以被各个线程调用),但各线程调用的都是该变量的副本(各调用各的,之间并无关系)。可以这么理解,使用 threading 模块中的 local() 函数,可以为各个线程创建完全属于它们自己的变量(又称线程局部变量)。正是由于各个线程操作的是属于自己的变量,该资源属于各个线程的私有资源,因此可以从根本上杜绝发生数据同步问题。

image-20200701221438544

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.csdn.net/weixin_43116910/article/details/88754349

1.2 functools.partial()

定了某个参数的值,使原来的调用少传一个参数。但是我们可能有某种函数场景,它的参数是也一个函数,比如回调函数

img

img

这种可以解决回调函数是show的情况,但是如果回调函数是别的呢?fly(h), eat(), run(date), 等等, 这种函数的参数你无法预知,你也不知道调用方会怎么调用,所以这时就可以使用 functools.partial 来生成一个新的函数。img

这样就可以在调用方自己来控制了函数的参数了。

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值