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模仿POST提交HTTP数据及使用Cookie值的方法
Nov 10 Python
Python3 操作符重载方法示例
Nov 23 Python
Python实现的HMacMD5加密算法示例
Apr 03 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
如何为Python终端提供持久性历史记录
Sep 03 Python
使用python切片实现二维数组复制示例
Nov 26 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
Python Django框架介绍之模板标签及模板的继承
May 27 Python
基于Python实现股票收益率分析
Apr 02 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
初识PHP
2014/09/28 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
javascript一点特殊用法
2008/05/28 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
JS的数组迭代方法
2015/02/05 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
详解Bootstrap插件
2016/04/25 Javascript
js数组去重的hash方法
2016/12/22 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
python动态参数用法实例分析
2015/05/25 Python
Python pass详细介绍及实例代码
2016/11/24 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
Python如何使用字符打印照片
2020/01/03 Python
Python 如何批量更新已安装的库
2020/05/26 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
学生发电厂实习自我鉴定
2013/09/22 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
校园开放日新闻稿
2015/07/17 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
初中思品教学反思
2016/02/20 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python