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内存管理分析
Apr 08 Python
Python 数据结构之旋转链表
Feb 25 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
Python解决八皇后问题示例
Apr 22 Python
终端命令查看TensorFlow版本号及路径的方法
Jun 13 Python
关于python写入文件自动换行的问题
Jun 23 Python
使用Python 统计高频字数的方法
Jan 31 Python
详解Python中is和==的区别
Mar 21 Python
python redis连接 有序集合去重的代码
Aug 04 Python
python模块内置属性概念及实例
Feb 18 Python
python中zip()函数遍历多个列表方法
Feb 18 Python
python turtle绘图
May 04 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
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
隐性调用php程序的方法
2009/03/09 PHP
PIGCMS 如何关闭聊天机器人
2015/02/12 PHP
浅谈php错误提示及查错方法
2015/07/14 PHP
AJAX的使用方法详解
2017/04/29 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
对Python 数组的切片操作详解
2018/07/02 Python
python与caffe改变通道顺序的方法
2018/08/04 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
高中微机老师自我鉴定
2014/02/16 职场文书
2014年国庆标语
2014/06/30 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
六查六看自查报告
2014/10/14 职场文书
建房合同协议书
2016/03/21 职场文书
会计专业自荐信范文
2019/05/22 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL