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 正则表达式 概述及常用字符
May 04 Python
python写入中英文字符串到文件的方法
May 06 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
使用Kivy将python程序打包为apk文件
Jul 29 Python
python实现画圆功能
Jan 25 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
用python生成1000个txt文件的方法
Oct 25 Python
django celery redis使用具体实践
Apr 08 Python
Python3多目标赋值及共享引用注意事项
May 27 Python
Python获取时间戳代码实例
Sep 24 Python
python操作docx写入内容,并控制文本的字体颜色
Feb 13 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
一个更简单的无限级分类菜单代码
2007/01/16 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
javascript 写类方式之六
2009/07/05 Javascript
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
Python os模块介绍
2014/11/30 Python
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
浅谈Python单向链表的实现
2015/12/24 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
把富文本的回车转为br标签
2019/08/09 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
物业项目经理岗位职责
2015/04/01 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python