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基础之函数用法实例详解
Sep 10 Python
python实现定时同步本机与北京时间的方法
Mar 24 Python
用Python中的__slots__缓存资源以节省内存开销的方法
Apr 02 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
Python简单读取json文件功能示例
Nov 30 Python
python+matplotlib演示电偶极子实例代码
Jan 12 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
在CentOS7下安装Python3教程解析
Jul 09 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
Nov 02 Python
python的变量和简单数字类型详解
Sep 15 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
解决File size limit exceeded 错误的方法
2013/06/14 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
python之wxPython应用实例
2014/09/28 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
python实现用户答题功能
2018/01/17 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
Python坐标线性插值应用实现
2019/11/13 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
使用Python实现批量ping操作方法
2020/05/06 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
小学生自我评价范例
2013/09/24 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
优秀小学生事迹材料
2014/12/26 职场文书