码迷,mamicode.com
首页 > 其他好文 > 详细

asyncio简介

时间:2020-06-16 01:20:44      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:ini   join   msi   html   imsi   noi   nis   jaf   表示   

官方文档:
 

为什么看这个

在看websockets的时候,发现不知道里面的async关键字是啥,为什么的函数调不到。就翻了翻官方文档看一下。
 
asyncio是python3.4中加入的,一种新的书写协程的方式。它也支持旧式的基于生成器的协程,即基于yield的协程。
 
再来回顾一下协程的概念:我理解的协程,就是同一个线程内的完全基于程序调用的,可以返回值,中途挂起,再回到执行处的程序。跟线程比较,优势就是少了上下文切换,更轻量级。另一个主要原因还是因为python的全局锁,让python的多线程比较鸡肋,协程优势就更大了。
 
本文中,主要将了和协程相关的一些知识。
 

以下是asyncio中的主要概念:

可等待对象:

可以在await中使用的对象,为可等待对象。
可等待对象主要有三种:协和,任务,Future
 

协程

可等待对象,因此可以在其他协程中被等待。
 
协程函数:async def定义的函数
协和对象:调用协程函数返回的对象。
asyncio也支持旧式的基于生成器的协程。
 
 

任务

用于进行并发
当一个协程通过asyncio.create_task等函数打包为一个任务,该协程将自动排入日程准备立即运行。
在调用await时,执行。
 

Futures

Future是一种特殊的低层级可等待对象,表示一个异步操作的最终结果。
当一个Future对象被等待,表示协程将保持等待直到该Future对象在其他地方操作完毕。
通常没必要在应用层级代码中创建Future对象
这个等到学的时候再来仔细看吧。感觉官方文档上讲得挺好的。
 
一般Futures用在三方库中,如websockets的源码中就用到了。应用层用得少。
 

常用函数

运行

运行一个可等待对象:
asyncio.run(func) #这里的func是协程函数
 

并发运行

awaitable asyncio.gather(*aws, loop=None, return_exceptions=False)
 

创建任务

task = asyncio.create_task(coro())
 

休眠

coroutine asyncio.sleep(delay, result=None, *)
delay: 阻塞秒数
result: 如果指定,则当协程完成时将其返回给调用者。
协程中的休眠。总是挂起当前任务,以允许其他任务运行。
 

屏蔽取消操作

保护一个可等操作,防止其被取消。
 

超时

指定等待await的超时的时间
 

简单示例

1、简单的可等待对象调用
两个await并非并发执行的。
import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at {time.strftime(‘%X‘)}")

    await say_after(1, ‘hello‘)
    await say_after(2, ‘world‘)

    print(f"finished at {time.strftime(‘%X‘)}")

asyncio.run(main())

  

 
2、使用task来进行并发执行
把示例1中的main方法改一下就可以了。
async def main():
    task1 = asyncio.create_task(
        say_after(1, ‘hello‘))

    task2 = asyncio.create_task(
        say_after(2, ‘world‘))

    print(f"started at {time.strftime(‘%X‘)}")

    # Wait until both tasks are completed (should take
    # around 2 seconds.)
    await task1
    await task2

    print(f"finished at {time.strftime(‘%X‘)}")

  

 
 
 

asyncio简介

标签:ini   join   msi   html   imsi   noi   nis   jaf   表示   

原文地址:https://www.cnblogs.com/ximixuexi/p/13138547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!