形成闭包的三个必备条件
当我们需要给函数添加一个功能,又不想通过修改源代码或者类的继承访问时,可以使用装饰器灵活添加和删除功能
进程:对各种资源管理的集合,占用独立的内存空间
线程:操作系统调用的最小单位,多线程共享内存空间,python的多线程只能在一个核心上跑,所以Python大多采用协程
协程:单线程 缺点和优点
GIL-全局解释器锁
任一时间,只允许一个线程使用解析锁,跟单CPU跑多个程序一个意思,大家都是轮着用的,这叫并发,不叫并行
适用场合
函数业务逻辑简单,使代码看起来更加pythonic
格式
lambda [参数]:[表达式
浅拷贝是将对象的引用赋值给另一个对象,因此如果我们在副本中进行修改时会影响源对象
深拷贝是将对象本身复制给另一个对象,这意味着如果对对象的副本进行更改时不会影响源对象
python所有异常的基类都是Exception,捕获异常用try…except… 还可以使用raise手动触发异常
可直接作用于for循环的对象称为可迭代对象,可迭代对象实现了iter魔法方法,迭代器则是实现iter和next魔法方法的对象,可以显示地获取下一个元素,生成器是特殊的迭代器,生成器返回一个迭代器,生成器中包含yield关键字,相当于一个断点,执行到此返回一个值后暂停,从而实现next取值
is是身份运算符,判断两个对象是否一样,==是比较操作符,看两个对象的值是否相等
time sys os random string re math
web服务网关接口,当一个Http请求过来的时候,就有一个相应的处理函数来进行处理和返回结果,wsgi就是规定了处理函数的输入和输出格式
使用WSGI接口,我们可以将Web服务器端和处理请求的Web框架进行分开,针对不同的需求我们可以开发不同的Web服务器和Web框架,然后自己组合使用、
服务器的Nginx一直处于监听状态,当客户端的浏览器发来请求后,Nginx根据请求信息进行分析,对于静态请求分发到静态资源返回数据,对于动态资源请求分发到相应的处理端口,计算分析后返回数据
程序的WSGI会一直监听某个端口,当监听到数据后,然后请求的数据封装成一个字典对象,然后同时提供一个start_response方法用于处理浏览器请求,返回相应的数据
字典对象和start_request方法作为参数,传递给一个实例,该实例一般有wsgi_app(environ,start_response)或者实现了call(self,environ,start_response)方法
上述中的实例调用strat_respnose方法返回WSGI中间件,中间件再返回给Nginx,数据最后返回给客户端的浏览器
程序中设计模式:大量的开发人员在长期的开发过程中,针对某一类问题,总结出来的通用 的解决方案,程序中使用的设计模式,可以大大提高开发的效率,减少犯错的几率,是他人可以更好的理解代码,代码更加可靠高效
设计模式是一种解决问题的方法模式,常用的是工厂模式和单例模式
class City(Object):
instance = None
def __new__(cls,*args,**kwargs):
if not cls.insatnce:
cls.instance = super().__new__(cls)
return cls.instance
else:
return cls.instance
在协程之中,调用一个任务类似于Python中调用一个函数一样,消耗的资源少
协程的相互切换只是单纯的操作CPU上下文,因此一秒钟可以切换上百万次
协程的最大优势就是消耗资源少,大量的切换系统也不会产生很大的问题
全局解析锁(GIL)
使用协程池gevent模块,遇到阻塞,自动切换协程
由于IO操作非常耗时,程序经常处于等待状态,比如请求多个网页有时候许哟啊等待,gevent可以自动切换协程
遇到阻塞自动切换协程,程序启动时执行Monkey.patch_all()解决,多个协程,可以采用pool管理并发数,限制并发任务数
from gevent import monkey;monkey.patch_all()
from urllib import request
from gevent.pool import Pool
def run_task(url):
print("Visit---->%s"%url)
try:
response = request.urlopen(url)
data = response.read()
except Excecption:
print("error")
return "url%s--->finish"%url
if __name__ == "__main__":
pool = Pool(2)
urls = ["https://github.com/","https://blog.csdn"]
results = pool.map(run_task,urls)
print(results)