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

 

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

上篇文章写了关于yield from的用法,简单的了解异步模式,【upload/201812201638557047.gif" alt="在控制台中显示一个由ASCII字符"|/-"构成的动画旋转指针." style="margin: 0px; padding: 0px; border: none; max-width: 900px; height: auto;" />

基本原理

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

  1 import  itertools   2 import sys   3 import time   4 flush=sys.stdout.flush   5 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 + ' ' + msg         print(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 result   def main():     loop = asynci
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信