Python异步编程之协程任务的调度操作实例分析
作者:dayL_W 发布时间:2023-02-23 17:03:46
本文实例讲述了Python异步编程之协程任务的调度操作。分享给大家供大家参考,具体如下:
我们知道协程是异步进行的,碰到IO阻塞型操作时需要调度其他任务,那么这个调度规则或者是算法是怎样的呢?现在有以下几个疑问:
1、多个任务准备好,需要运行时,优先执行哪一个?
2、一个任务运行时,如果别的任务准备好了,是否需要中断当前任务呢?
在网上找了很多资料,也无法找到相关的资料,于是编写了几个简单的程序,查看任务的执行过程。
根据Python的asyncio我们可以编写一个简单的程序:
import asyncio
async def a(x):
while x>0:
print('a:',x)
await asyncio.sleep(0.5)
x -= 1
async def b(x):
while x>0:
print('b:',x)
await asyncio.sleep(1.8)
x -= 1
async def c(x):
while x>0:
print('c:',x)
await asyncio.sleep(1.5)
x -= 1
loop = asyncio.get_event_loop()
tasks = [a(2),b(2),c(2)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
我们创建一个loop事件,把a,b,c3个函数加入到任务中,用asyncio.sleep(1)来切换运行其他程序。运行结果如下:
b: 2
c: 2
a: 2
a: 1
c: 1
b: 1
这里一直有一个疑问,开始运行任务时,3个任务同时准备好,为什么执行顺序是b,a,c。
我们分析一下函数的执行过程,先执行b,然后阻塞,执行c,阻塞,再执行a,阻塞。函数调用过程是b->c->a,0.5s过后a完成,1.5s过后c完成,1.8s过后b完成。
修改睡眠时间,我们可以测试出很多情况,最后得出了任务调度的规则,可能有一些地方总结的不对,欢迎大家来指正。
1、初始化,asyncio把需要执行的任务加入到任务队列中。
2、从队首拿出一个任务来运行,如果任务被阻塞,则拿另一个任务队列,在任务切换是需要保存每个任务的工作环境。
3、把IO的完成,定时时间到的时间加入到事件队列,从队首中拿出事件去唤醒相应的任务。
好像看起来很简单,又有点像操作系统,又有点像中断,但是操作系统是感知不到它的存在,更没有调用中断了。这里我们要注意,加入有一个任务正在运行,同时有一个事件发生,asyncio是不会中断当前任务的,而是等这个任务碰到了阻塞才会处理这个事件,所以编程时需要把任务分的很细,尽量不要让任务执行过长的时间。
希望本文所述对大家Python程序设计有所帮助。
来源:https://blog.csdn.net/u013181595/article/details/76974475


猜你喜欢
- cookie:PHPSESSID=et4a33og7nbftv60j3v9m86cro; Hm_lvt_51e3cc975b346e7705
- 有些时候因为某些原因(如本地机器资源不足、数据不能离网等),需要使用本地电脑连接远程服务器进行开发工作,在这里记录下如何在远程Linux上配
- 默认情况下,TensorFlow 会映射进程可见的所有 GPU 的几乎所有 GPU 内存(取决于 CUDA_VISIBLE_DEVICES)
- 自相关图是一个平面二维坐标悬垂线图。横坐标表示延迟阶数,纵坐标表示自相关系数偏自相关图跟自相关图类似, 横坐标表示延迟阶数,纵坐标表示偏自相
- 之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片。最近做项目,打算换个方法上传图片。Android发展到现在,Okhttp
- 我在按照 Byte of python一步步的学习Python, 在学到‘解决方案'的时候,原文的实例 “backup_ver1.p
- 1)按笔画排序 select * from Table order by nlssort(columnName,'NLS_SORT=
- 本文实例为大家分享了python实现人机对战井字棋的具体代码,供大家参考,具体内容如下游戏简介:在九宫格内进行,如果一方抢先于另一方向(横、
- 因为 GAE 在国内访问不便,所以平时有一些小应用,我都会放在 SAE 上面, 虽然 SAE 还有很多缺陷,但算是上手比较容易的一个了,最起
- 目录1. 常用的编码2.补充:计算机表示的单位:3.ASCII编码2.GBK和GB2312编码4.Unicode5.UTF-8编码6.编码和
- 但是你懂的,浏览器实在太不和谐了,兼容性且不说,各种坐标属性看得人头昏眼花,极容易混淆。好吧,我来总结一下: 测试浏览器:IE8, Chro
- 1.turtle库turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0
- 以下是我开发时碰到的问题以及心得经验,花了些时间调试,贴出来避免大家少走弯路,如有错误欢迎指正,持续更新ing xml文件尽量以
- 1. 首先介绍pip常用命令pip安装命令: pip install package_name pip升级命令:pip install –u
- 发现pyautocad模块:可以用python控制autocad的包。今天把文档中的重点内容摘录出来,以后绘图、计算大工程量、或者识别施工图
- 假如有一个数组是这样子:var arr1 = ["a", "b", "c", &
- 什么是nodejs?node.js是基于Chrome javaScript运行时建立的平台,用于方便地搭建响应速度快、易于扩展的网络应用。(
- Mysql分页采用limt关键字select * from t_order limit 5,10; #返回第6-15行数据select *
- 基本映射映射使用在根据不同URLs请求来产生相对应的返回内容.Bottle使用route() 修饰器来实现映射.from bottle im
- 本文实例讲述了Python 面向对象静态方法、类方法、属性方法知识点。分享给大家供大家参考,具体如下:(1)静态方法--》-@staticm