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 数据加密代码
Dec 24 Python
python+Django+apache的配置方法详解
Jun 01 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
微信跳一跳辅助python代码实现
Jan 05 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
python引用(import)某个模块提示没找到对应模块的解决方法
Jan 19 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
Apr 29 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
python 并发下载器实现方法示例
Nov 22 Python
Python竟然能剪辑视频
May 25 Python
Python下opencv库的安装过程及问题汇总
Jun 11 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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 feof用来识别文件末尾字符的方法
2010/08/01 PHP
php变量范围介绍
2012/10/15 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
jQuery Ajax 全解析
2009/02/08 Javascript
你必须知道的Javascript知识点之"this指针"的应用
2013/04/23 Javascript
中止javascript执行的方法
2014/02/14 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
原生js实现放大镜
2017/02/20 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
Python面向对象编程基础实例分析
2020/01/17 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
用python计算文件的MD5值
2020/12/23 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
网络方面基础面试题
2012/11/16 面试题
担保书怎么写
2014/04/01 职场文书
工厂车间标语
2014/06/19 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
PyTorch中的torch.cat简单介绍
2022/03/17 Python
nginx容器方式反向代理实战
2022/04/18 Servers
Pandas 数据编码的十种方法
2022/04/20 Python
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL