Python并发编程一直是进阶当中不可跨越的一道坎,其中包括进程、线程、协程,今天我们就来聊一聊协程。
![3126e74fa40f34484eef55e05453f4f7.png](https://i-blog.csdnimg.cn/blog_migrate/79bc86b51b6d549c324058a100a0c2cd.jpeg)
协程的定义很简单,从头到尾只有一条任务线在进行,就像是你可以在煮鸡蛋的时候背单词,但无论是煮鸡蛋还是背单词,始终都是你一个人在进行任务,线程的概念稍有不同,是把一个人分成两个人,一个在煮鸡蛋,一个在背单词,我们直接上代码看一下:
![4c243c0e43aafa8293ce5d2faa228184.png](https://i-blog.csdnimg.cn/blog_migrate/fdddbeb29dc0363a053beeef25f22c00.jpeg)
这是一段普通的代码,我们分别让不同的url睡眠不同的时间,总共是10s,看一下运行结果:
![6f1af32341a8a7ae08a812365fbc59ef.png](https://i-blog.csdnimg.cn/blog_migrate/0f0a3b3ec704fd67b80630e871c8110e.jpeg)
然后,我们使用协程来执行这段代码:
![91b0cf4f698fd51f0d1a16c84cc9f6a5.png](https://i-blog.csdnimg.cn/blog_migrate/bce542f75d65fe607c40275f3d8c1192.jpeg)
我们来看一下运行时间:
![c33285ed56acc8a89dc7c0a2065c6109.png](https://i-blog.csdnimg.cn/blog_migrate/06201c371b8ca3536a0cb98700e72025.jpeg)
从结果来看,运行时间从10s缩短到了4s,基本上是最长的那个程序的运行时间。
那么具体的协程实现的具体原理是什么呢,我们来分解一下代码:
![0b78988e93401ac628d21d2df1e8e977.png](https://i-blog.csdnimg.cn/blog_migrate/3ee0b41e63c56607da44b151e9103614.jpeg)
先看一下输出内容:
![f9c18a0b8920cf5d0af6ec33da7fd5f2.png](https://i-blog.csdnimg.cn/blog_migrate/7c8b728e6ee23d7ec9d7ef74f88c2f8a.jpeg)
我们这里使用async来声明一个异步函数,使用await来执行异步函数,await的执行效果会使程序阻塞在这里,最后需要使用asyncio.run()来触发运行,asyncio.run()作为主程序的入口函数,在整个过程中只执行一次
当使用Task创建任务时,所有任务都会做好准备:
- 首先打印'before await'
- 执行await task1,打印'worker_1 start',遇到sleep开始切换
- 切换到执行await task2,后续没有需要执行的任务,所以暂时停留在Task2
- 当task1的sleep完成,任务切回task1,打印'worker_1 done'
- 之后切回task2等待sleep完成,打印'worker_2 done'
以上就是协程的执行顺序了。
希望大家这个例子可以帮助大家更好的运用python。