线程安全,偏函数和面向对象补充
flask进阶
什么是线程安全
极快的解决阻塞,保证公共对象的安全性。
浪费非常严重的资源
时空转换:使用空间换取时间
原理:
class Foo(object):
pass
f=Foo()
f.num=0
dic={}
def add(i):
f.num=i
# print(get_ident())
dic[get_ident()]=deepcopy(f)
time.sleep(1)
print(dic[get_ident()].num)
for i in range(20):
task=Thread(target=add,args=(i,))
task.start()
使用local:
class Foo(local):
pass
f=Foo()
f.num=0
def add(i):
f.num=i
# print(get_ident())
time.sleep(1)
print(f.num)
for i in range(20):
task=Thread(target=add,args=(i,))
task.start()
什么是偏函数
将原函数和原函数接收的参数一并存放. 返回新函数,在执行新函数时,将参数传入原函数中一并执行
from functools import partial
def abfunc(a,b):
return a+b
newab=partial(abfunc,2,3)
print(newab)
print(newab())
面向对象(oop)
__call__方法
类实例化对象加() 执行类的__call__方法
class Foo(object):
def __call__(self, *args, **kwargs):
# print("aaaa")
return "BBB"
f=Foo()
f()
属性的创建,赋值,提取
创建
class Foo(object):
pass
f=Foo()
f.name="alexdsb"
_setattr_
class Foo(object):
pass
f=Foo()
f.name=123
使用类实例化对象.属性的时候调用的是__setattr__
_getattr_
class Foo(object):
pass
f=Foo()
f.name=123
f.name
在类里没有name属性,没有静态属性,在__init__没有初始化name方法时.使用实例化对象.属性名 是调用__getattr__ (__getattribute__)
_setitem_
class Foo(object):
pass
f=Foo()
f[name]=123
使用f[name]=123 增加属性时,调用__setitem__方法
_getitem_
class Foo(object):
pass
f=Foo()
f[name]=123
f[name]
使用f[name] 获取属性时,调用__getitem__方法
请求上下文
请求是如何到达flask应用的
···