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

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 

 可以在这里设置断点 查看value 的值

可以通过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()函数变成了协程函数

 

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值