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 相关文章推荐
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
python如何对实例属性进行类型检查
Mar 20 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
Python错误处理操作示例
Jul 18 Python
python实现微信小程序自动回复
Sep 10 Python
使用python判断你是青少年还是老年人
Nov 29 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
Django中的静态文件管理过程解析
Aug 01 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
Python在线和离线安装第三方库的方法
Oct 31 Python
python模拟点击玩游戏的实例讲解
Nov 26 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在window iis的莫名问题的测试方法
2013/05/14 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
CI框架表单验证实例详解
2016/11/21 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
python清除字符串里非字母字符的方法
2015/07/02 Python
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
2015年度工程师评职称工作总结
2015/10/14 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers