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中使用Boolean操作符做真值测试实例
Jan 30 Python
python通过opencv实现批量剪切图片
Nov 13 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
python如何发布自已pip项目的方法步骤
Oct 09 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
Apr 01 Python
Python数据类型之String字符串实例详解
May 08 Python
python安装scipy的方法步骤
Jun 26 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
通过Python编写一个简单登录功能过程解析
Sep 04 Python
pytorch:实现简单的GAN示例(MNIST数据集)
Jan 10 Python
如何理解Python中包的引入
May 29 Python
python实现计算图形面积
Feb 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设计模式 Mediator (中介者模式)
2011/06/26 PHP
php实现生成验证码实例分享
2016/04/10 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
php查询内存信息操作示例
2019/05/09 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
浅说js变量
2011/05/25 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
Python本地与全局命名空间用法实例
2015/06/16 Python
Python快速从注释生成文档的方法
2016/12/26 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
QML实现钟表效果
2020/06/02 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
总务岗位职责
2013/11/19 职场文书
同事吵架检讨书
2014/02/05 职场文书
项目经理任命书
2014/06/04 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
python 中yaml文件用法大全
2021/07/04 Python
Golang 字符串的常见操作
2022/04/19 Golang