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实现将html表格转换成CSV文件的方法
Jun 28 Python
python中zip()方法应用实例分析
Apr 16 Python
Python实现类的创建与使用方法示例
Jul 25 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 Python
python+selenium实现简历自动刷新的示例代码
May 20 Python
python Kmeans算法原理深入解析
Aug 23 Python
Python WebSocket长连接心跳与短连接的示例
Nov 24 Python
Python文件名匹配与文件复制的实现
Dec 11 Python
python 三种方法提取pdf中的图片
Feb 07 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
bat批处理之字符串操作的实现
Mar 16 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
mysql5详细安装教程
2007/01/15 PHP
php 使用post,get的一种简洁方式
2010/04/25 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
vue.js简单配置axios的方法详解
2017/12/13 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
vue实现移动端图片上传功能
2019/12/23 Javascript
python修改字典内key对应值的方法
2015/07/11 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
python实现可逆简单的加密算法
2019/03/22 Python
详解Python 切片语法
2019/06/10 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
会计专业应届生自荐信
2014/02/07 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
文明城市创建标语
2014/06/16 职场文书
广告业务员岗位职责
2015/02/13 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis
Java 多态分析
2022/04/26 Java/Android