Python使用asyncio处理异步编程的代码示例

 更新时间:2024年07月09日 11:35:32   作者:杰哥在此  
在 Python 中,异步编程可以使用 asyncio 库,该库提供了一些工具和功能来编写异步代码,本文介绍了处理异步编程的几个关键概念和示例,需要的朋友可以参考下

在 Python 中,异步编程可以使用 asyncio 库,该库提供了一些工具和功能来编写异步代码。以下是处理异步编程的几个关键概念和示例。

关键概念

  1. 异步函数(coroutine):使用 async def 定义的函数。
  2. 等待(await):在异步函数内部使用 await 关键字等待一个异步操作完成。
  3. 事件循环(event loop):异步操作的调度器,管理所有的异步任务和回调。
  4. 任务(task):由事件循环调度执行的协程。

基本示例

以下是一个简单的异步函数示例:

import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

# 获取事件循环并运行异步函数
asyncio.run(say_hello())

在这个示例中,say_hello 是一个异步函数,它在打印 “Hello” 后等待一秒钟,然后打印 “World”。

并发执行多个异步函数

可以使用 asyncio.gather 并发执行多个异步函数:

import asyncio

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

async def main():
    task1 = asyncio.create_task(say_after(1, "Hello"))
    task2 = asyncio.create_task(say_after(2, "World"))

    await task1
    await task2

asyncio.run(main())

在这个示例中,main 函数创建了两个任务 task1 和 task2,并发执行它们。say_after 函数等待指定的时间后打印消息。

异步 I/O 操作

异步编程特别适用于 I/O 密集型任务,如网络请求。以下是一个使用 aiohttp 库进行异步 HTTP 请求的示例:

import aiohttp
import asyncio

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    url = 'https://www.example.com'
    html = await fetch(url)
    print(html)

asyncio.run(main())

在这个示例中,fetch 函数使用 aiohttp 库进行异步 HTTP 请求,main 函数调用 fetch 并打印响应内容。

超时处理

可以使用 asyncio.wait_for 设置超时:

import asyncio

async def say_hello():
    await asyncio.sleep(2)
    return "Hello, World!"

async def main():
    try:
        result = await asyncio.wait_for(say_hello(), timeout=1)
        print(result)
    except asyncio.TimeoutError:
        print("The coroutine took too long to complete")

asyncio.run(main())

在这个示例中,如果 say_hello 函数在 1 秒内没有完成,将会引发 asyncio.TimeoutError

异步上下文管理器和迭代器

可以使用 async with 和 async for 处理异步上下文管理器和迭代器:

import aiohttp
import asyncio

class AsyncContextManager:
    async def __aenter__(self):
        print("Entering context")
        return self

    async def __aexit__(self, exc_type, exc, tb):
        print("Exiting context")

    async def do_something(self):
        await asyncio.sleep(1)
        print("Doing something")

async def main():
    async with AsyncContextManager() as manager:
        await manager.do_something()

asyncio.run(main())

在这个示例中,AsyncContextManager 类实现了异步上下文管理协议。main 函数使用 async with 进入和退出上下文,并调用异步方法 do_something

小结

通过使用 asyncio 库,Python 提供了一种强大且灵活的方式来处理异步编程。异步编程可以显著提高 I/O 密集型任务的性能,使得代码在处理多个任务时更加高效。掌握异步编程的基本概念和工具将有助于你编写高性能的异步应用程序。

以上就是Python使用asyncio处理异步编程的代码示例的详细内容,更多关于Python处理异步编程的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈python socket函数中,send与sendall的区别与使用方法

    浅谈python socket函数中,send与sendall的区别与使用方法

    下面小编就为大家带来一篇浅谈python socket函数中,send与sendall的区别与使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Python遍历列表时删除元素案例

    Python遍历列表时删除元素案例

    这篇文章主要介绍了Python遍历列表时删除元素案例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • django中使用Celery 布式任务队列过程详解

    django中使用Celery 布式任务队列过程详解

    这篇文章主要介绍了django中使用Celery 布式任务队列实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 如何用python多次调用exe文件运行不同的结果

    如何用python多次调用exe文件运行不同的结果

    有个C++项目是读取配置参数文件并打印对应的结果,后来需要多次修改配置文件并运行,于是想到写个python脚本执行这一过程,今天通过本文给大家分享python多次调用exe文件运行不同的结果,感兴趣的朋友一起看看吧
    2023-05-05
  • 详解pandas安装若干异常及解决方案总结

    详解pandas安装若干异常及解决方案总结

    这篇文章主要介绍了详解pandas安装若干异常及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Python进阶之@property动态属性的实现

    Python进阶之@property动态属性的实现

    这篇文章主要介绍了Python进阶之@property动态属性的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 利用selenium爬虫抓取数据的基础教程

    利用selenium爬虫抓取数据的基础教程

    这篇文章主要给大家介绍了关于如何利用selenium爬虫抓取数据的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用selenium具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • 检测pytorch是否使用GPU的方法小结

    检测pytorch是否使用GPU的方法小结

    pytorch在服务器上跑的很慢,nvidia-smi显示GPU利用率一直是0%,所以本文总结了一些可以检测深度学习算法是否在使用GPU的方法,需要的朋友可以参考下
    2023-12-12
  • Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色

    Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色

    这篇文章主要介绍了Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色,在文章末尾有一个小训练——是将所学得的图像颜色修改应用为画板一般的刷新,需要的朋友可以参考下
    2020-03-03
  • 关于Python卷积函数详解

    关于Python卷积函数详解

    这篇文章主要介绍了Python关于卷积的理解,文中有详细的代码示例,具有很好的参考价值,希望对大家有所帮助
    2023-04-04

最新评论