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中的super用法详解
May 28 Python
python的else子句使用指南
Feb 27 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
python实现两个文件合并功能
Apr 01 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 Python
Python Pillow(PIL)库的用法详解
Sep 19 Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 Python
Python编程super应用场景及示例解析
Oct 05 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
文件上传类
2006/10/09 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
vue点击页面空白处实现保存功能
2019/11/06 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
centos系统升级python 2.7.3
2014/07/03 Python
Python 自动化表单提交实例代码
2017/06/08 Python
python随机数分布random测试
2018/08/27 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
python实现最短路径的实例方法
2020/07/19 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
长青弘远的面试题
2012/06/09 面试题
卖车协议书
2014/04/21 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
工人先进事迹材料
2014/12/26 职场文书
八一建军节主持词
2015/07/01 职场文书
活动简报范文
2015/07/22 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis