Python asyncio是什么?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: **Python的asyncio库简介** asyncio是Python的异步I/O框架,基于协程,用以编写并发代码。它引入了`async`和`await`关键字,简化了异步编程,避免回调地狱。核心是事件循环,管理并调度异步任务。asyncio旨在解决Python 3.4之前的并发问题,如多线程和多进程的复杂性和低效。通过asyncio,开发者可以更高效地处理IO密集型任务,如并发下载多个网站内容。例如,使用`asyncio.gather`并发等待所有网络请求,相比`threading`模块,代码更简洁,执行更高效。

一、前言

最近看到很多关于 asyncio 的代码,所以本篇文章,我们需要详细聊一下 asyncio,不会有过多的关于 asyncio  本身函数使用的例子,重点关注是什么以及为什么,asyncio 函数相对较简单。

二、asyncio

2.1 asyncio 是什么?

  • 本质asyncio 是基于协程的,提供了一套编写单线程并发代码的框架。它使用 asyncawait 语法来定义和执行异步操作,从而避免了传统的回调方式,代码更加直观和易于维护。asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。
  • 三条原则
  1. 异步性:使用 async 定义异步函数,await 用于挂起阻塞操作,如 IO 请求。
  2. 事件循环asyncio 提供事件循环来管理和调度执行异步任务。
  3. 协程:异步函数在 Python 中被称为协程,它们是可等待对象,可以在事件循环中被挂起和恢复。

2.2 asyncio 解决了什么问题

  • 起源asyncio 是 Python 用于解决异步 IO 编程的标准库,它在 Python 3.4 版本中引入。它的出现是为了提供一种简单的方式来编写并发代码。在此之前,Python 通过多线程和多进程等方式实现并发,但这些方式在性能和易用性上存在限制。
  • 对比状态
  • 出现之前:Python 开发者需要依赖 threadingmultiprocessing 模块来实现并发,这不仅编程模型复杂,而且在处理大量并发网络连接时效率低下。
  • 出现之后asyncio 提供了事件循环和协程的概念,使得开发者能够以更低的开销实现大规模 IO 密集型任务的并发。
  • 怎么理解?来看一下一个具体的案例:
  • 背景:假设有一个需要从多个网站上下载数据的任务。
  • 解决方案:使用 asyncio 创建异步函数来发起网络请求,并且并发地等待所有请求完成,而不是顺序地一个接一个地请求,从而大大提高了效率。
  • 代码片断

python

  • 复制代码
import asyncio
import aiohttp

async def download_site(session, url):
    async with session.get(url) as response:
        print(f"Read {response.content_length} from {url}")

async def download_all_sites(sites):
    async with aiohttp.ClientSession() as session:
        tasks = []
        for url in sites:
            task = asyncio.create_task(download_site(session, url))
            tasks.append(task)
        await asyncio.gather(*tasks)

sites = ["https://example1.com", "https://example2.com"]
asyncio.run(download_all_sites(sites))
  • 在这个例子中,我们定义了两个异步函数 download_sitedownload_all_sitesdownload_site 函数用于下载单个网站的内容,而 download_all_sites 函数则创建了一个 ClientSession 并发起多个异步请求,最后使用 asyncio.gather 并发等待所有的请求完成。通过这种方式,我们可以利用 asyncio 实现高效的并发 IO 操作。
    asyncio 出现之前,Python 开发者常用 threading 模块来实现并发。以下是一个使用 threading 模块下载多个网站内容的例子:

python

  • 复制代码
import threading
import requests
from time import time

def download_site(url):
    with requests.get(url) as response:
        print(f"Read {len(response.content)} from {url}")

def download_all_sites(sites):
    threads = []
    for url in sites:
        thread = threading.Thread(target=download_site, args=(url,))
        thread.start()
        threads.append(thread)
    for thread in threads:
        thread.join()

if __name__ == "__main__":
    sites = ["https://example1.com", "https://example2.com"] * 10
    start_time = time()
    download_all_sites(sites)
    duration = time() - start_time
    print(f"Downloaded {len(sites)} sites in {duration} seconds")

2.23 asyncio 例子

直观的感受一下:

python

复制代码

import asyncio
async def say_hello():
    print("Hello,")
    await asyncio.sleep(1)
    print("World!")
asyncio.run(say_hello())

其他方法的使用,我们就不过多的举例子了,具体可以参考官方文档,相对较简单!

三、总结

本文详细介绍了Python中的asyncio库,包括其本质、解决的问题以及提供的示例。asyncio是基于协程的框架,使用async和await语法来定义和执行异步操作,避免了传统的回调方式,适合构建IO密集型和高层级结构化网络代码。它解决了Python中多线程和多进程方式实现并发时的性能和易用性限制。最后,提供了一个简单的示例来展示asyncio的使用。

转载来源:https://juejin.cn/post/7346233811212566569

相关文章
|
2月前
|
Python
Python中的异步编程:理解asyncio库的原理与应用
传统的同步编程模型在处理大量IO密集型任务时往往效率低下,而异步编程模型的兴起为解决这一难题提供了有效的解决方案。本文将深入探讨Python中的异步编程,重点介绍asyncio库的原理与应用,帮助读者更好地理解和运用异步编程技术。
|
2月前
|
调度 开发者 Python
异步编程在Python中的应用:Asyncio和Coroutines
【4月更文挑战第9天】本文介绍了Python中的异步编程,强调了其在提高程序性能和响应能力中的作用。文章重点讨论了`asyncio`模块和协程的概念,协程是可暂停和恢复的特殊函数,而`asyncio`提供事件循环和任务管理,实现异步I/O操作。通过一个简单的HTTP服务器示例,展示了如何使用`asyncio`和协程处理并发请求。异步编程已成为Python开发中的重要技能,尤其在处理大量I/O操作时。
|
15天前
|
存储 对象存储 Python
Python|玩转 Asyncio 任务处理(1)
Python|玩转 Asyncio 任务处理(1)
21 5
|
4天前
|
调度 开发者 Python
什么是Python asyncio
**Python的asyncio库概述** asyncio是Python的异步I/O框架,基于协程,提供了一种编写并发代码的简洁方式。它引入了`async`和`await`关键字,用于定义和执行异步操作,简化了IO密集型任务的并发处理。事件循环是核心,负责调度协程任务。asyncio解决了传统多线程/多进程并发的复杂性和效率问题,尤其适合结构化的网络编程。例如,通过并发下载多个网站,asyncio能提高效率,对比之下,使用`threading`模块则更为低效。简而言之,asyncio是Python高效异步编程的标准工具。
|
27天前
|
C语言 Python 容器
Python:从头创建 Asyncio (1)
Python:从头创建 Asyncio (1)
13 2
Python:从头创建 Asyncio (1)
|
22天前
|
API Python
Python:从头创建 Asyncio (2)
Python:从头创建 Asyncio (2)
10 0
|
10天前
|
存储 API 数据库
Python|玩转 Asyncio 任务处理(2)
Python|玩转 Asyncio 任务处理(2)
16 0
|
1月前
|
JavaScript 前端开发 程序员
Python协程与asyncio
理解Python中的协程,我们需从其底层原理开始,逐步深入。协程的核心在于控制流的非阻塞式管理,它允许在单一线程内实现并发处理,通过事件循环和协作式多任务来提高效率。
|
2月前
|
调度 Python
Python中的异步编程: asyncio库详解 与应用
Python中的异步编程: asyncio库详解 与应用
45 0
|
2月前
|
人工智能 Python
Python asyncio 的 Future 和 Task
Python asyncio 的 Future 和 Task
32 1

热门文章

最新文章