协程

协程

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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值