Python asyncio是什么?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容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和aiohttp
【8月更文挑战第24天】在Python中,异步编程是一个强大的工具,它可以帮助我们编写出高性能的网络应用。本文将介绍Python的异步编程库asyncio和aiohttp,并通过示例代码展示如何使用它们来创建一个简单的HTTP服务器。我们将看到,通过使用这些库,我们可以在不阻塞主线程的情况下处理大量的并发请求。
|
3天前
|
数据处理 开发者 Python
浅析Python中的异步编程:从asyncio到Tornado
Python的异步编程是提升应用性能的关键。本文从Python的异步编程概念入手,探讨了asyncio库的使用及其在实际开发中的应用,并分析了Tornado框架的异步模型,以及如何将异步思维运用于实际项目中。
|
6天前
|
调度 开发者 Python
Python中异步编程的魔法:深入理解asyncio和aiohttp
【9月更文挑战第26天】本文旨在探索Python语言中的异步编程世界,通过深入浅出的方式介绍核心库asyncio和流行的HTTP客户端aiohttp。我们将从基础概念入手,逐步过渡到高级应用,揭示如何在不阻塞主线程的情况下实现高效并发操作。文章不仅提供理论框架,还附带实战代码示例,让读者能够快速掌握并应用到实际项目中。
14 3
|
7天前
|
程序员 API 开发者
探索Python中的异步编程:从asyncio到Trio
在本文中,我们将深入探讨Python的异步编程世界。不同于传统摘要的枯燥介绍,我们将通过一个虚构的故事,讲述一个名叫艾丽的程序员如何在一个周末的编程马拉松中,通过使用Python的asyncio库解决了一个复杂的并发问题,并在最后意外发现了Trio库,从而开启了她对异步编程的新理解。
|
10天前
|
调度 开发者 Python
探索Python中的异步编程:理解asyncio和协程
【9月更文挑战第22天】在现代软件工程中,异步编程是提升应用性能的关键技术之一。本文将深入探讨Python语言中的异步编程模型,特别是asyncio库的使用和协程的概念。我们将了解如何通过事件循环和任务来处理并发操作,以及如何用协程来编写非阻塞的代码。文章不仅会介绍理论知识,还会通过实际的代码示例展示如何在Python中实现高效的异步操作。
|
10天前
|
设计模式 数据处理 调度
Python中的异步编程:理解并使用Asyncio
【9月更文挑战第22天】在Python中,传统的同步编程模式可能会遇到性能瓶颈,特别是在处理I/O密集型任务时。异步编程提供了一种高效处理并发任务的方法,而asyncio是Python中实现异步编程的库之一。本文将深入介绍asyncio的基本概念、使用方法和实际案例,帮助初学者理解如何在Python中使用异步编程来提升程序的性能和响应性。
13 3
|
14天前
|
开发者 Python
探索Python中的异步编程:理解Asyncio和协程
【9月更文挑战第18天】在Python的世界中,异步编程是一个强大而神秘的概念。它像是一把双刃剑,掌握得好可以大幅提升程序的效率和性能;使用不当则可能让代码变得难以维护和理解。本文将带你一探究竟,通过深入浅出的方式介绍Python中asyncio库和协程的基本概念、使用方法及其背后的原理,让你对异步编程有一个全新的认识。
|
2月前
|
数据采集 调度 开发者
Python并发编程:异步编程(asyncio模块)
本文详细介绍了 Python 的 asyncio 模块,包括其基础概念、核心组件、常用功能等,并通过多个示例展示了如何在实际项目中应用这些技术。通过学习这些内容,您应该能够熟练掌握 Python 中的异步编程,提高编写并发程序的能力。 异步编程可以显著提高程序的响应速度和并发处理能力,但也带来了新的挑战和问题。在使用 asyncio 时,需要注意合理设计协程和任务,避免阻塞操作,并充分利用事件循环和异步 I/O 操作。
|
2月前
|
调度 数据库 UED
Python使用asyncio包实现异步编程方式
异步编程是一种编程范式,用于处理程序中需要等待异步操作完成后才能继续执行的情况。 异步编程允许程序在执行耗时的操作时不被阻塞,而是在等待操作完成时继续执行其他任务。 这对于处理诸如文件 I/O、网络请求、定时器等需要等待的操作非常有用。
|
2月前
|
数据采集 设计模式 数据处理
探索Python中的异步编程:使用asyncio和aiohttp构建高性能Web爬虫
【8月更文挑战第27天】在数字时代的浪潮中,数据抓取技术成为获取网络信息的重要手段。本文将引导读者步入Python异步编程的殿堂,详细探讨如何使用asyncio库和aiohttp模块来构建一个高性能的Web爬虫。文章不仅提供理论知识,还通过实际代码示例,展示如何实现非阻塞I/O操作,从而显著提高程序执行效率,让数据处理变得更加迅速和高效。
下一篇
无影云桌面