Python异步编程(Async Programming)实用总结

文摘   2024-11-19 22:48   江苏  

大家好,今天桥哥要带大家飞速入门Python的异步编程!啥是异步编程?简单来说,就是让你的程序同时处理多个任务,就像餐厅的服务员可以同时接待好几桌客人,效率杠杠的!尤其是在网络请求、文件读写这些耗时的操作上,异步编程简直就是神器!Python 3.5以后,有了asyncawait这两个关键字,异步编程变得更简单了。

异步函数 (async def)

想玩转异步,首先得认识async def。它就像一个咒语,把普通的函数变成异步函数。异步函数可以在执行过程中暂停,去处理其他任务,等需要的结果出来后再回来继续执行。这就像你去餐厅点菜,服务员下单后,你可以先去看看手机,而不是傻傻地等着菜上来。

import asyncio
async def greet(name): await asyncio.sleep(1) # 模拟耗时1秒的操作 print(f"Hello, {name}!")
asyncio.run(greet("桥哥"))

这段代码定义了一个greet函数,它会先暂停1秒,然后打印问候语。asyncio.sleep(1)模拟了一个耗时1秒的操作,例如网络请求。asyncio.run()是启动异步函数的入口。

异步等待 (await)

await关键字就像交通指挥员,它告诉异步函数暂停执行,等后面的操作完成后再继续。await只能用在async def定义的异步函数里面。

import asyncio
async def say_after(delay, what): await asyncio.sleep(delay) print(what)
async def main(): await say_after(1, 'hello') await say_after(2, 'world')
asyncio.run(main())

这里,main函数先等待say_after(1, 'hello')执行完,再等待say_after(2, 'world')执行完。虽然总共耗时3秒,但程序并没有阻塞,可以同时处理其他任务。

事件循环 (Event Loop)

事件循环是异步编程的心脏,它负责调度和执行异步任务。就像餐厅的经理,负责安排服务员的工作。asyncio.run()会自动创建一个事件循环,并运行传入的异步函数。

异步任务 (Tasks)

异步任务就像餐厅里的每一桌客人,每个任务都是独立的。asyncio.create_task()可以创建一个任务,并把它交给事件循环去管理。

import asyncio
async def say_after(delay, what): await asyncio.sleep(delay) print(what)
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.run(main())

这里创建了两个任务task1task2,它们会并发执行,而不是一个接一个地执行。

并发和并行

异步编程实现的是并发,而不是并行。并发就像单核CPU同时处理多个任务,通过快速切换来实现“同时”执行的效果。并行就像多核CPU,每个核心可以真正地同时执行一个任务。对于I/O密集型任务,异步编程通常比多线程或多进程更高效。

异步框架

asyncio是Python标准库里的异步框架,但还有其他选择,比如triocurio,它们提供了更简洁的API和更多功能。

异常处理

异步编程的异常处理和同步编程类似,用try...except块来捕获异常。

import asyncio
async def main(): try: await asyncio.sleep(1) raise ValueError("出错了!") except ValueError as e: print(f"捕获到异常: {e}")
asyncio.run(main())

性能考量

异步编程并非万能药,对于计算密集型任务,同步编程可能更合适。用time模块或性能分析工具来评估异步代码的性能。

测试和调试

测试异步代码要用支持异步的测试框架,比如pytest-asyncio。调试异步代码可能比同步代码复杂,可以用日志和断点来追踪问题。

实用工具和库

  • aiohttp: 异步HTTP客户端/服务器框架。
  • aiomysql, aiopg: 异步MySQL和PostgreSQL数据库驱动。
  • asyncio-redis: 异步Redis客户端。

温馨提示:异步编程需要多练习才能掌握。可以先尝试把现有的同步代码改成异步的,再逐步构建复杂的异步应用。

结尾总结:今天我们学习了Python异步编程的基础知识,包括asyncawait、事件循环、任务等等。希望大家多多练习,早日成为异步编程高手!记住,异步编程就像餐厅的服务员,可以同时处理多个任务,效率杠杠的!

夜半探案
每日一案,一案一法,一起学习生活中的法律知识。
 最新文章