上篇文章写了关于yield from的用法,简单的了解异步模式,【上次的内容链接】这次让我们通过一个有趣例子带大家了解asyncio基本使用。

目标效果图

在控制台中显示一个由ASCII字符"|/-\"构成的动画旋转指针.

基本原理

1.通过不停的依次顺序迭代"|/-\"中的一个字符。
2.每次输出前使用退格符模拟一个动态效果。所谓的退格符就是删除上一个字符串,并在原来的位置输出新的字符串。
代码实现:

  1 import  itertools2 import sys3 import time4 flush=sys.stdout.flush5 for i in  itertools.cycle("|/-\\"):6      print('\b'*len(i)+i,end='')7      flush()8      time.sleep(.1)
复制代码

代码解释

1,2,3行导入需要的包。

4行定义7行调用,强制刷新缓存。
当我们打印一些字符时,并不是调用print函数后就立即打印的。
一般会先将字符送到缓冲区,然后再打印。这就存在一个问题,
如果你想等时间间隔的打印一些字符,
但由于缓冲区没满,不会打印。就需要采取强制刷新等手段了。

5行,使用itertools.cycle无穷的迭代括号内的字符串。

6行,print默认是print(end='\n'),这里修改其默认方法end='',不换行。
关键作用的是'\b','\b'*len(i)表示多次退格,长度由迭代的字符的个数决定。

8行 模拟休眠0.1秒。
这里只是一个简单的效果演示,下面我们使用一个使用协程的例子。

使用asyncio完成同样的功能

该例子参考流畅的python,我对其作了部分修改。先看代码,后面再做解释。

# -*- coding: utf-8 -*-
# @Time : 2018/12/19 9:08 PM
# @Author : cxa
# @File : 18-2.py
# @Software: PyCharm
# 通过协程以动画形式显示文本式旋转指针
import asyncio
import itertools
import sys
import time
async def spin(msg):  # (1)write, flush = sys.stdout.write, sys.stdout.flush  # (2)for char in itertools.cycle('|/-\\'):  #(3) status = char + ' ' + msgprint(status, end='')flush()  #(4) # write('\b' * len(status))  # (5) print('\b' * len(status), end='')  # (6) try:await asyncio.sleep(.1)  # (7) except asyncio.CancelledError: # (8) break# write(" " * len(status) + '\b' * len(status))  # (9) print(" " * len(status) + '\b' * len(status), end='') # (10)async def slow_function():# 假装等待io一段时间await asyncio.sleep(3)return "very good!"async def supervisor():# loop = asyncio.get_event_loop() # (11)# spinner = loop.create_task(spin('thking!')) # (12)spinner = asyncio.ensure_future(spin('thking!'))  # (13)print('spinner object:', spinner) # (14)result = await slow_function()  # (15)spinner.cancel()   # (16)return resultdef main():loop = asyncio.get_event_loop()  # (17)result = loop.run_until_complete(supervisor())  # (18)loop.close()# (19)print("Result:", result)if __name__ == '__main__':main()
复制代码

下面对上面编号进行一一讲解。
首先导入必须的包,其中asyncio就是我们要使用的协程包。
(1)def代表一个函数或者方法,如果在前面加async def这个就变成协程了。不再是一个方法。
在python3.4的时候通过使用@asyncio.coroutine来修饰一个函数使其变为一个协程。现在不推荐使用。

(2) 定义对象方便后面使用。

(3)itertools.cycle会把一个可迭代对象无限重复下去。

(4)强制刷新缓存

(5)(6)这两个是等价的:
当我们在使用print的时候,实际上是调用了 sys.stdout.write(obj+'\n'),print在打印时会自动加个换行符。
这里就是一开始说的使用指定字符串长度的退格符

(7)我们使用asyncio.sleep函数来模拟IO操作。

(8)执行(16)的时候触发。

(9)(10)这两个是等价的,输出最后的显示结果。

(11)(12)这两句可以用(13)来替代使用asyncio.ensure_future(coroutine)
和 loop.create_task(coroutine)都可以创建一个task。

(14) 输出的是一个协程对象

(15)使用await把控制权交给主循环,以便loop调用其他的协程。

(16)Task对象可以取消,取消后会在协程当前暂停的yield处抛出asyncio.CancelledError异常。

(17)(18) asyncio.get_event_loop方法可以创建一个事件循环,
然后使用run_until_complete将协程注册到事件循环,并启动事件循环。协程的返回值是这次调用的返回值。

(19)结束循环。

参考资料:

流畅的python 第16章

关于asyncio的后续的一些使用请关注公众号:python学习开发。

一个有趣的小例子,带你入门协程模块-asyncio相关推荐

  1. 小例子带你入门多线程

    当时我刚开始学习并发编程其实是挺茫然的,讲的好的视频资料很少,只能靠自己看书看文档.但是大部分书是写的是比较教科书似的,让人看一眼就想关上.所以自己在入门之后,就想做一个简单的并发编程的教程,方便想要 ...

  2. 有趣的python代码实例_Python之路:200个Python有趣的小例子一网打尽

    概述 博主最近在学习python,看完了一整套学习视频,然后呃呃呃,还是用不太流畅.碰巧在全球最大的 同性交友论坛GayHub(呸!是开源代码托管平台Github)上面发现了一个项目,该项目列举了20 ...

  3. 用几个最简单的例子带你入门 Python 爬虫

    作者 | ZackSock 来源 | 新建文件夹X(ID:ZackSock) 头图 | CSDN下载自视觉中国 前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独 ...

  4. 图解爬虫,用几个最简单的例子带你入门Python爬虫

    一.前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独爱Python.之所以偏爱Python就是因为她简洁的语法,我们使用Python可以很简单的写出一个爬虫程序 ...

  5. Golang并发模型:轻松入门协程池

    goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...

  6. 一个故事讲完进程、线程和协程

    一个故事讲完进程.线程和协程 很久以前,有两个程序,暂且称他们旺财和小强吧. 旺财和小强这两个程序都很长,每个都有十几万行. 他们两个的人生价值就是到CPU上去运行,把运行结果告诉人类. CPU是稀缺 ...

  7. Java基础。public,private,static变量!以及一个实例化的小例子 以及方法

    public,适用范围最广! private,仅仅方法内部可以使用!创建出来的对象也是不可以使用的! 代码: public class mmm12333 {public int a = 1111;pr ...

  8. 三个有趣的小故事带你了解C、C++和C#!魔法师的“火球术”

    大家好,C.C++和C#这三种语言对于学编程的大家来说都听过或者学过,那这三种语言有什么区别呢,今天小编通过三个小故事和大家简单聊一聊. ▎故事1:把大象装到冰箱里 ● C C语言是一个极其高冷的人, ...

  9. 决策树分析例题经典案例_决策树原理及一个简单的小例子

    首先通过两个图来引入什么是决策树. 是否学习的决策过程 决策树是仿树结构来进行决策的,例如上图来说,我们要对'是否学习'这个问题进行决策时,通常伴随一系列的子决策.先看是否有'对象',有的话是否需要' ...

最新文章

  1. android 按照星期 时间 定时_Spring Boot实现定时任务的四种方式
  2. 2021年春季学期-信号与系统-第八次作业参考答案-第八小题
  3. pytorch定义神经卷积网络CNN源码
  4. iOS控件之UILabel
  5. Python 把函数视作对象
  6. 四、PHP基础——会话技术Cookie 和 Session
  7. python的表达式范围怎么写_python表达式
  8. ARM产品系列对应架构图
  9. 【Logstash】Logstash:把MySQL数据导入到Elasticsearch中
  10. linux查看nec进程状态,【linux】 /proc/PID/stat
  11. 程序员如何在技术浪潮的更迭中保持较高的成长速度 ?
  12. 计算机科学渗透信息论的思想,认知主义理论
  13. 2022年5月26日:用C#生成.NET应用程序--创建新的.NET项目并使用依赖项(部分没看懂。)
  14. 迈思德物联网网关问答集锦
  15. 第 04 课 用户管理
  16. MAT之NSL:SOFM神经网络实现预测哪个样本与哪个样本处在同一层,从而科学规避我国煤矿突水灾难
  17. CentOS7安装教程
  18. GLU, sparsemax, GELU激活函数
  19. 第10届(深圳)城市艺博会即将于12月13日开幕!
  20. 大概这就是“无监督学习”的机器学习算法实例

热门文章

  1. Android中的BuildConfig类怎么来的
  2. 第五周项目四-长方柱型(2)
  3. C++入门教程,全套C++基础教程(已更新完毕)
  4. Android Linux下的常用命令行
  5. vbox 设置linux共享文件夹,Windows 7下设置VirtualBox中Linux共享文件夹
  6. Android之子菜单的创建
  7. Android之四大组件概念讲解
  8. iOS 绘画 点与像素
  9. LintCode 1.A+B的问题
  10. HDU 1043 Eight(双向BFS+康托展开)