写点什么

Python Asyncio 二探:使用和用途

作者:宇宙之一粟
  • 2022 年 7 月 10 日
  • 本文字数:1325 字

    阅读完需:约 4 分钟

Python Asyncio 二探:使用和用途

前言


Asyncio 不是多线程或多进程,而是并行运行代码。


JavaScript 中支持异步执行(浏览器,Nodejs,Electron 等)。在早期版本中,他们只是使用回调功能在异步操作完成后运行其他功能。但是它在 JavaScript 中创建了回调问题,因此在过去的十年中的某个时候,它们实现了相同的异步等待界面,我们在 Python 3.6+ 中具有。该界面在使用相同的并行 IO 效率的序列执行中寻找用户


使用代码

import asyncioimport time
def write(msg): print(msg, flush=True)
async def say1(): await asyncio.sleep(1) write("Hello from 1")
async def say2(): await asyncio.sleep(1) write("Hello from 2")
write("start")loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.gather( say1(), say2()))
write("exit")
loop.close()
复制代码

运行该代码,可以看到 Hello from 1 运行 1 秒后运行 Hello from 2

$ python asyncoidemo2.py startHello from 1Hello from 2exit
复制代码


run_until_complete 运行 say() 函数,解释器会逐行执行该函数的内容。当碰到 await 之后,解释器开始异步操作:这个操作为了循环将完成一些内部回调操作,这个回调操作是对开发人员隐藏的。但是现在,say1 开始后,它立即将控制返回到事件循环。所以,它启动异步 sleep 和控制循环,然后循环实际上已经开始启动 say2 函数。


当第一次异步 sleep 运行 1 秒后,进入内部回调执行 say1 协程,下一个操作是打印 Hello from 1。打印后,它再次返回到活动循环。同时,从第二次睡眠开始,循环获得了有关完成第二次睡眠的事件。


所以接下来 Hello from 2 打印,然后第二种方法也返回。 run_until_complete(gather(l1,l2,l3)) 将阻止所有 l1,l2,l3 Coroutines:


请注意,7 和 9 事件可能会交换 - 如果您多次运行代码,您可能会注意到 Hello from 1 打印在 Hello from 2之后。


  • event_loop 事件循环:程序开启一个无限循环,把一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数

  • coroutine 协程:协程对象,指一个使用 async 关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。

  • task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含了任务的各种状态

  • future: 代表将来执行或没有执行的任务的结果。它和 task 上没有本质上的区别

  • async/await 关键字:python3.5 用于定义协程的关键字,async 定义一个协程,await 用于挂起阻塞的异步调用接口。

asyncio 用途


当您需要并行多个 CPU 操作时。协程仅用于 IO 操作,例如某些 HTTP 客户端,例如 aiohttps 调用服务器。

CPU 计算操作,例如机器学习,在巨大的数列上循环,加快 CPU 运算。


Python 中异步程序员工具套件中的最基本工具是新的关键字 async def,它用于声明异步的 coroutine 函数,其方式与定义正常同步函数的 def 相同。


总结

当我们使用 asyncio 时,我们会使用单个过程线程同时执行所有任务。asyncio 是一个整洁的概念,并且每个数据科学家至少应该知道要使代码运行速度更快。了解该过程的良好工作知识也将帮助您了解即将到来的库,例如 Fastapi,Aiohttp,Aiofiles,Puppeteer 等。

发布于: 刚刚阅读数: 5
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020.05.07 加入

🏆InfoQ写作平台-第二季签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于软件工程师,弹性不加班 热衷分享,执着于阅读写作,佛系不水文

评论

发布
暂无评论
Python Asyncio 二探:使用和用途_Python_宇宙之一粟_InfoQ写作社区