上一篇
Python事件循环教程:如何使用asyncio事件循环 | Python异步编程指南
- Python
- 2025-08-08
- 732
Python事件循环使用教程
深入理解asyncio事件循环机制及其实际应用
什么是事件循环?
事件循环是Python异步编程的核心机制,它负责调度和执行异步任务,协调I/O操作,以及管理协程的执行。事件循环的工作原理如下:
- 维护一个任务队列(协程)
- 在单线程中调度任务的执行
- 当任务遇到I/O操作时挂起,执行其他任务
- 当I/O操作完成时,唤醒对应的任务继续执行
为什么需要事件循环? 事件循环允许Python在单线程中高效处理大量I/O密集型操作(如网络请求、文件读写),避免线程切换开销,提升程序性能。
基础使用:创建和运行事件循环
使用Python的asyncio模块可以轻松创建和管理事件循环:
示例1:基本事件循环
import asyncio
# 定义一个简单的协程
async def hello_world():
print("Hello")
await asyncio.sleep(1) # 模拟I/O操作
print("World")
# 获取事件循环
loop = asyncio.get_event_loop()
try:
# 运行协程直到完成
loop.run_until_complete(hello_world())
finally:
# 关闭事件循环
loop.close()
示例2:运行多个协程
import asyncio
async def task(name, seconds):
print(f"Task {name} started")
await asyncio.sleep(seconds)
print(f"Task {name} completed after {seconds} seconds")
async def main():
# 创建多个任务
tasks = [
task("A", 2),
task("B", 1),
task("C", 3)
]
# 同时运行所有任务
await asyncio.gather(*tasks)
# Python 3.7+ 使用更简洁的方式运行
asyncio.run(main())
高级事件循环操作
1. 在事件循环中执行同步函数
import asyncio
import time
def blocking_io():
print("阻塞操作开始")
time.sleep(2) # 模拟耗时同步操作
print("阻塞操作完成")
async def main():
loop = asyncio.get_running_loop()
# 在默认线程池中执行阻塞函数
await loop.run_in_executor(None, blocking_io)
print("继续执行异步代码")
asyncio.run(main())
2. 定时任务
import asyncio
async def periodic_task():
while True:
print("执行周期性任务")
await asyncio.sleep(5) # 每5秒执行一次
async def main():
task = asyncio.create_task(periodic_task())
# 运行10秒后取消任务
await asyncio.sleep(10)
task.cancel()
try:
await task
except asyncio.CancelledError:
print("周期性任务已取消")
asyncio.run(main())
实际应用场景
Web请求处理
使用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():
urls = [
'https://example.com',
'https://python.org',
'https://github.com'
]
# 同时获取所有URL
pages = await asyncio.gather(
*[fetch(url) for url in urls]
)
for url, content in zip(urls, pages):
print(f"{url}: {len(content)} bytes")
asyncio.run(main())
数据库操作
使用异步数据库驱动提高数据库访问效率:
import asyncio
import asyncpg
async def query_db():
conn = await asyncpg.connect(
user='user',
password='password',
database='database',
host='localhost'
)
# 执行异步查询
result = await conn.fetch("SELECT * FROM users")
for record in result:
print(record)
await conn.close()
asyncio.run(query_db())
最佳实践与常见问题
避免阻塞事件循环: 不要在协程中使用同步阻塞操作(如time.sleep()),这会阻塞整个事件循环。
使用asyncio.run(): Python 3.7+ 推荐使用asyncio.run()管理主协程,它会自动创建和关闭事件循环。
合理控制并发: 使用信号量(Semaphore)限制并发数量,避免同时发起过多请求。
异常处理: 确保为每个任务添加异常处理,避免单个任务异常导致整个程序崩溃。
本文由NiuSong于2025-08-08发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://liuhe.jltcw.com/20257617.html
发表评论