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中List.count()方法的使用教程
May 20 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
Jun 11 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
Python实现的线性回归算法示例【附csv文件下载】
Dec 29 Python
python常用库之NumPy和sklearn入门
Jul 11 Python
Python爬虫:url中带字典列表参数的编码转换方法
Aug 21 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
python微信公众号开发简单流程实现
Mar 09 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
Jun 30 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
如何基于Python pygame实现动画跑马灯
Nov 18 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异常处理使用示例
2014/02/25 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
JS命名空间的另一种实现
2013/08/09 Javascript
json数据的列循环示例
2013/09/06 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
AngularJS入门之动画
2016/07/27 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
Python创建文件和追加文件内容实例
2014/10/21 Python
在Django的视图中使用form对象的方法
2015/07/18 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
python机器学习库xgboost的使用
2020/01/20 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
初入社会应届生求职信
2013/11/18 职场文书
幼儿教师考核制度
2014/01/25 职场文书
借款协议书范本
2014/04/22 职场文书
员工工作自我评价
2014/09/26 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
初中班主任工作随笔
2015/08/15 职场文书