1.进程和线程
2. 同步和异步
3.协程
4.生成器到协程
5.asyncio 模块(协程模块)
………………………………………………………………………………
1.进程和线程
进程
相当于一个任务,比如做饭
线程
相当于操作,做饭需要 解冻肉,洗菜,煮米饭
一个进程任务,做饭下需要多进程 做饭的多个进程,如上
GIL全局解释器锁是用在IO密集型(大量的文件读写,多次请求网络数据)的多线程中
对比单线程和多线程的例子:
调用包 time和 线程包:threading
先模拟请求网络数据的函数 request_data()
多线程这里输出的0.0126秒 这么快实际上是只要多线程中的100个线程中的任意一个线程结束了,就开始计算时间去了
所以需要再修改一下程序才行,需要调用join方法
join方法实现了 只要100个线程没有完全结束,就阻塞在那里,不执行计算时间的步骤
现在的时间增加了一点
…………………………………………………………………………………………………
2. 同步和异步
由于线程和进程都是由操作系统决定的,所以CPU抢占时间片的事控制不了
……………………………………………………………………………………
3.协程
比线程的颗粒度小,可以控制线程什么时候执行和怎么关联
协程其实是通过 生成器实现的 generator
关键:yield 相当于一个return 语句
g 一个生成器 每次调用的时候用next 来生成下一个数
惰性生成器
这个包可以查看生成器的状态
在执行一次之后就变成了 挂起状态 GEN_SUSPENDED,等待下一次的yeild的调用
修改一下语句:使得后面可以接受值 传给vaule 给生成器里面传值
可以利用send方法 把一个值传给value
同样 为了使这个值有接受的地方,需要修改一下语句, 将 yield b 改成value=yield b
可以通过for循环将生成器中的所有值调用出来
通过print(g.throw(ValueError)) 可以抛出异常,让生成器来捕获一些异常
通过 g.close() 关闭迭代器
……………………………………………………………………………………
4.生成器到协程
装饰器:以一个函数作为参数,并返回一个函数
装饰器有什么作用 : 激活生成器
因为需要激活生成器,激活yeild的下一个输出。
激活的方法用好几种:g.next() g.send('hhh') 装饰器active() 函数
一个小例子 用到了 chain函数
这是输的结果,验证了chain函数的功能
接下来使用yield关键字实现chain方法 ,在这里我想看看return语句的功能结果让我大吃一惊
关于 yeild 的介绍 这篇博文不错哦 可以看 https://blog.csdn.net/mieleizhi0522/article/details/82142856
为了更加节省代码,直接用 yeild from 代替for 循环(在生成器中)
def my_chain(*args): #*args 表示可以输入任意个参数
for iter_obj in args:
# for i in iter_obj:
# yield i
yield from iter_obj
yeild from 案例
yeild 的作用:可以停止程序的运行,等待下一次next,cpu会因为yeild而停止,就是协程
一
5.asyncio 模块(协程模块)
简化工作 用 asyncio.coroutine 装饰器快速创建协程函数
创建协程函数需要用到 asyncio.coroutine
event_loop 中包含任务,任务中包含对象,对象中有协程函数
event_loop 事件循环可以实现哪一个协程先执行,哪一个后执行
这段代码中并没有 yeild 语句,但是函数开始前一行是一个@asyncio.coroutine 装饰器,这个装饰器直接把这个request_data()函数变成了协程函数
再加一个任务,合起来执行
这就结束了 这只是个开头,接下来再学习新的东西……