python异步(并行)编程 听课笔记

1.进程和线程

2. 同步和异步

3.协程

4.生成器到协程

5.asyncio 模块(协程模块)

………………………………………………………………………………

1.进程和线程

进程

相当于一个任务,比如做饭

线程

相当于操作,做饭需要 解冻肉,洗菜,煮米饭

一个进程任务,做饭下需要多进程  做饭的多个进程,如上

python异步(并行)编程 听课笔记_第1张图片

python异步(并行)编程 听课笔记_第2张图片

GIL全局解释器锁是用在IO密集型(大量的文件读写,多次请求网络数据)的多线程中

对比单线程和多线程的例子:

调用包 time和 线程包:threading 

先模拟请求网络数据的函数 request_data()

python异步(并行)编程 听课笔记_第3张图片

 python异步(并行)编程 听课笔记_第4张图片

多线程这里输出的0.0126秒 这么快实际上是只要多线程中的100个线程中的任意一个线程结束了,就开始计算时间去了

所以需要再修改一下程序才行,需要调用join方法

python异步(并行)编程 听课笔记_第5张图片

join方法实现了 只要100个线程没有完全结束,就阻塞在那里,不执行计算时间的步骤

现在的时间增加了一点

…………………………………………………………………………………………………

2. 同步和异步

python异步(并行)编程 听课笔记_第6张图片

由于线程和进程都是由操作系统决定的,所以CPU抢占时间片的事控制不了

……………………………………………………………………………………

3.协程

比线程的颗粒度小,可以控制线程什么时候执行和怎么关联

python异步(并行)编程 听课笔记_第7张图片
协程其实是通过 生成器实现的 generator

关键:yield    相当于一个return 语句 

g 一个生成器  每次调用的时候用next 来生成下一个数

python异步(并行)编程 听课笔记_第8张图片

惰性生成器

python异步(并行)编程 听课笔记_第9张图片

python异步(并行)编程 听课笔记_第10张图片

这个包可以查看生成器的状态

python异步(并行)编程 听课笔记_第11张图片

在执行一次之后就变成了 挂起状态 GEN_SUSPENDED,等待下一次的yeild的调用

 

python异步(并行)编程 听课笔记_第12张图片

修改一下语句:使得后面可以接受值 传给vaule 给生成器里面传值   

可以利用send方法 把一个值传给value 

同样 为了使这个值有接受的地方,需要修改一下语句,将 yield b 改成value=yield b 

python异步(并行)编程 听课笔记_第13张图片 可以在这里设置断点 查看value 的值

python异步(并行)编程 听课笔记_第14张图片

可以通过for循环将生成器中的所有值调用出来

通过print(g.throw(ValueError))  可以抛出异常,让生成器来捕获一些异常

python异步(并行)编程 听课笔记_第15张图片

通过 g.close() 关闭迭代器

……………………………………………………………………………………

4.生成器到协程

装饰器:以一个函数作为参数,并返回一个函数

python异步(并行)编程 听课笔记_第16张图片

装饰器有什么作用   :  激活生成器

因为需要激活生成器,激活yeild的下一个输出。

激活的方法用好几种:g.next()   g.send('hhh')  装饰器active() 函数  

python异步(并行)编程 听课笔记_第17张图片

python异步(并行)编程 听课笔记_第18张图片

一个小例子  用到了 chain函数

python异步(并行)编程 听课笔记_第19张图片

python异步(并行)编程 听课笔记_第20张图片  这是输的结果,验证了chain函数的功能

接下来使用yield关键字实现chain方法 ,在这里我想看看return语句的功能结果让我大吃一惊

python异步(并行)编程 听课笔记_第21张图片

python异步(并行)编程 听课笔记_第22张图片

关于 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

python异步(并行)编程 听课笔记_第23张图片

yeild from 案例

python异步(并行)编程 听课笔记_第24张图片

yeild 的作用:可以停止程序的运行,等待下一次next,cpu会因为yeild而停止,就是协程

5.asyncio 模块(协程模块)

简化工作 用 asyncio.coroutine 装饰器快速创建协程函数

python异步(并行)编程 听课笔记_第25张图片

创建协程函数需要用到 asyncio.coroutine 

event_loop 中包含任务,任务中包含对象,对象中有协程函数

event_loop 事件循环可以实现哪一个协程先执行,哪一个后执行

python异步(并行)编程 听课笔记_第26张图片

这段代码中并没有  yeild 语句,但是函数开始前一行是一个@asyncio.coroutine  装饰器,这个装饰器直接把这个request_data()函数变成了协程函数

 

python异步(并行)编程 听课笔记_第27张图片

再加一个任务,合起来执行

python异步(并行)编程 听课笔记_第28张图片

这就结束了   这只是个开头,接下来再学习新的东西……

你可能感兴趣的:(Python)