协程
Interable 可迭代
isinstance 是否是指定类型
包管理不同的模块
生成器是特殊的迭代器
使用for循环迭代使用的过程、
1.可迭代对象
能使用for循环遍历取值的对象就是可迭代对象
使用isinstance判断
元组,列表,字典,字符串,集合,range
默认创建类的对象不是可迭代对象
2.自定义可迭代对象
默认创建类的对象不是可迭代对象,所以需要创建可迭代对象
在类里提高一个( iter )方法
前两个下划线后两个下划线,叫做模版方法,有特殊含义
!只是要想把数据遍历出来,还需要迭代器
3.迭代器
在类里提供__iter__ 再创造迭代器类,提供__next__方法才是迭代器
next获取指定对象的下一值
4.iter和next函数
iter()获取迭代器
next()获取迭代器的下一值
所以说,for循环的本事是,iter获取可迭代对象的迭代器,next依次取下一值
如果直接遍历的是迭代器,直接通过next获迭代器中每一个值,for循环内部自动捕获停止迭代异常
5.斐波那契数列
通过迭代器来实现next
6.生成器
是一类特殊的迭代器,依然可以使用next for 循环,快速生存迭代器
第一种生成器,列表推导式的中括号改为小括号
第二种用yield
只要在函数里看到yeid关键字就是生成器
使用yield代替return,返回其后的值
而且会暂停代码
也是用next调用下一个值
生成器里也可以使用return关键字,表示生成器迭代完成,只能在python3,执行到return表示停止迭代,抛出停止迭代异常,获取return的值,要在e.value
除了使用next还可以用send()方法,启动生成器,可以传入参数
fb.send(None) == next(fb)
genorator_name.send() 生成器只有第二次才可以发送参数,第一次不行
第一次send(None)
7.yield用户级线程,做协程
不开辟线程,单线程下完成多任务,执行多个函数,多个任务顺序交替执行
8.greenlet的使用
封装yield
g1 = greenlet.greenlet()
g1.switch()
9.重点使用gevent切换协程
封装greenlet
*args表示按照位置方式传入参
**args表示用关键字传
创建 g1 = gevent.spwan()
记得要让主线程等待协程结束
主线程如果没有耗时操作,不会自动切换到join
g1.join()
gevent需要识别到耗时操作才能自己切换到其他执行代码,所以要用gevent.sleep
time.sleep recv accept 网络请求,需要打个补丁让gevent识别耗时操作,导入monkey模块
from gevent import monkey
monkey.path_all()
所以说gevent创建后就会自动运行,但是有两个前提,程序一直运行,而且要有耗时操作
主程序结束了,协程也会结束
因为他是比较智能的
10.开辟一个线程大概需要512kb,一个协程大概5kb
协程占用的资源是最少的
gevent.joinall([g1,g1,g3])