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 相关文章推荐
python3学习笔记之多进程分布式小例子
Feb 13 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
Python库安装速度过慢解决方案
Jul 14 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
python中reload重载实例用法
Dec 15 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面向对象之多态
2014/08/20 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python命令行参数解析模块getopt使用实例
2015/04/13 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
python flask实现分页的示例代码
2018/08/02 Python
Python实现FM算法解析
2019/06/18 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
给导游的表扬信
2014/01/10 职场文书
小学教师听课制度
2014/02/01 职场文书
单位绩效考核方案
2014/05/11 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
2015年考研复习计划
2015/01/19 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
Redis命令处理过程源码解析
2022/02/12 Redis
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫