Python异步编程之协程任务的调度操作实例分析


Posted in Python onFebruary 01, 2020

本文实例讲述了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程序设计有所帮助。

Python 相关文章推荐
python实现简单的socket server实例
Apr 29 Python
python实现傅里叶级数展开的实现
Jul 21 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
在Python 字典中一键对应多个值的实例
Feb 03 Python
Django多数据库的实现过程详解
Aug 01 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
TensorBoard 计算图的可视化实现
Feb 15 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
Python环境使用OpenCV检测人脸实现教程
Oct 19 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 #Python
Python random模块制作简易的四位数验证码
Feb 01 #Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 #Python
Python warning警告出现的原因及忽略方法
Jan 31 #Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 #Python
PyQt5中多线程模块QThread使用方法的实现
Jan 31 #Python
浅谈python之自动化运维(Paramiko)
Jan 31 #Python
You might like
php 设计模式之 单例模式
2008/12/19 PHP
php下通过伪造http头破解防盗链的代码
2010/07/03 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
小程序转发探索示例
2019/02/19 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
Django框架安装方法图文详解
2019/11/04 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
教育系毕业生中文求职信范文
2013/10/06 职场文书
安全协议书范本
2014/04/21 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
2015年禁毒工作总结
2015/04/30 职场文书
杨善洲电影观后感
2015/06/04 职场文书
教师节随笔
2015/08/15 职场文书