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实现在控制台输入密码不显示的方法
Jul 02 Python
在Python的Django框架中包装视图函数
Jul 20 Python
Python中数字以及算数运算符的相关使用
Oct 12 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
Jan 20 Python
Python入门_浅谈for循环、while循环
May 16 Python
一道python走迷宫算法题
Jan 22 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
pytorch 预训练层的使用方法
Aug 20 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 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添加xml文档内容的方法
2015/01/23 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
简洁的十分钟Python入门教程
2015/04/03 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
python中return不返回值的问题解析
2020/07/22 Python
详解pandas apply 并行处理的几种方法
2021/02/24 Python
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
岗位职责的定义
2013/11/10 职场文书
学术会议邀请函范文
2014/01/22 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
班级年度安全计划书
2014/05/01 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年超市工作总结
2015/04/09 职场文书
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js
Nginx配置https的实现
2021/11/27 Servers
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL