Python异步编程基础
Python的异步编程主要依赖于asyncio
库,这是一个用于编写并发代码的库,使用async
和await
关键字。
异步函数定义
异步函数使用async def
定义。
# 定义一个异步函数
async def hello():print('Hello')await asyncio.sleep(1) # 异步等待print('world')
异步函数调用
异步函数需要使用await
调用,或者在事件循环中运行。
# 直接使用await调用异步函数
async def main():await hello()# 运行事件循环
asyncio.run(main())
异步等待多个任务
asyncio.gather
可以并发运行多个异步任务。
# 异步等待多个任务
async def hello(n):await asyncio.sleep(n)return f'Hello {n}'async def main():print('Start')tasks = [hello(1), hello(2), hello(3)]results = await asyncio.gather(*tasks)print(results) # 输出: ['Hello 1', 'Hello 2', 'Hello 3']print('Finish')asyncio.run(main())
异步上下文管理器
异步上下文管理器使用async with
。
# 异步上下文管理器
class AsyncContextManager:async def __aenter__(self):print('Enter')return selfasync def __aexit__(self, exc_type, exc, tb):print('Exit')# 使用异步上下文管理器
async def main():async with AsyncContextManager() as acm:print('Inside context manager')asyncio.run(main())
异步锁
asyncio.Lock
用于异步编程中的同步。
# 异步锁
lock = asyncio.Lock()async def critical_section():async with lock:print('Critical section')async def main():tasks = [critical_section(), critical_section()]await asyncio.gather(*tasks)asyncio.run(main())
异步IO操作
aiohttp
库可以用来进行异步HTTP请求。
# 异步HTTP请求
import aiohttp
import asyncioasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():async with aiohttp.ClientSession() as session:html = await fetch(session, 'http://python.org')print(html) # 输出网页内容asyncio.run(main())
以上是一些基本的异步编程概念和示例,在实际开发中,异步编程可以用于提高IO密集型任务的效率,例如网络请求、文件读写等。