python 协程可以嵌套协程吗_揭秘Python并发编程——协程

Python并发编程一直是进阶当中不可跨越的一道坎,其中包括进程、线程、协程,今天我们就来聊一聊协程。

3126e74fa40f34484eef55e05453f4f7.png

协程的定义很简单,从头到尾只有一条任务线在进行,就像是你可以在煮鸡蛋的时候背单词,但无论是煮鸡蛋还是背单词,始终都是你一个人在进行任务,线程的概念稍有不同,是把一个人分成两个人,一个在煮鸡蛋,一个在背单词,我们直接上代码看一下:

4c243c0e43aafa8293ce5d2faa228184.png

这是一段普通的代码,我们分别让不同的url睡眠不同的时间,总共是10s,看一下运行结果:

6f1af32341a8a7ae08a812365fbc59ef.png

然后,我们使用协程来执行这段代码:

91b0cf4f698fd51f0d1a16c84cc9f6a5.png

我们来看一下运行时间:

c33285ed56acc8a89dc7c0a2065c6109.png

从结果来看,运行时间从10s缩短到了4s,基本上是最长的那个程序的运行时间。

那么具体的协程实现的具体原理是什么呢,我们来分解一下代码:

0b78988e93401ac628d21d2df1e8e977.png

先看一下输出内容:

f9c18a0b8920cf5d0af6ec33da7fd5f2.png

我们这里使用async来声明一个异步函数,使用await来执行异步函数,await的执行效果会使程序阻塞在这里,最后需要使用asyncio.run()来触发运行,asyncio.run()作为主程序的入口函数,在整个过程中只执行一次

当使用Task创建任务时,所有任务都会做好准备:

  1. 首先打印'before await'
  2. 执行await task1,打印'worker_1 start',遇到sleep开始切换
  3. 切换到执行await task2,后续没有需要执行的任务,所以暂时停留在Task2
  4. 当task1的sleep完成,任务切回task1,打印'worker_1 done'
  5. 之后切回task2等待sleep完成,打印'worker_2 done'

以上就是协程的执行顺序了。

希望大家这个例子可以帮助大家更好的运用python。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值