Python asyncio核心原理与高阶应用全解析
作者:第一程序员
这篇文章主要介绍了Python asyncio核心原理与高阶应用,asyncio是Python中强大的异步I/O框架,它允许我们编写高效的并发代码,通过掌握asyncio的高级应用,我们可以编写更加高效、响应迅速的应用程序,需要的朋友可以参考下
1. asyncio 基础
asyncio 是 Python 3.4+ 引入的异步 I/O 框架,它允许我们编写异步代码,提高程序的并发性能。
import asyncio
async def main():
print("Hello")
await asyncio.sleep(1)
print("World")
# 运行异步函数
asyncio.run(main())2. 高级 asyncio 技巧
2.1 任务管理
import asyncio
async def task1():
await asyncio.sleep(1)
print("Task 1 completed")
return "Task 1 result"
async def task2():
await asyncio.sleep(2)
print("Task 2 completed")
return "Task 2 result"
async def main():
# 创建任务
task1_obj = asyncio.create_task(task1())
task2_obj = asyncio.create_task(task2())
# 等待任务完成
result1 = await task1_obj
result2 = await task2_obj
print(f"Results: {result1}, {result2}")
asyncio.run(main())2.2 并发执行
import asyncio
async def fetch_data(id):
await asyncio.sleep(1)
return f"Data {id}"
async def main():
# 并发执行多个任务
results = await asyncio.gather(
fetch_data(1),
fetch_data(2),
fetch_data(3)
)
print(f"Results: {results}")
asyncio.run(main())2.3 超时处理
import asyncio
async def slow_operation():
await asyncio.sleep(2)
return "Operation completed"
async def main():
try:
# 设置超时
result = await asyncio.wait_for(slow_operation(), timeout=1)
print(f"Result: {result}")
except asyncio.TimeoutError:
print("Operation timed out")
asyncio.run(main())2.4 事件循环
import asyncio
async def main():
print("Hello")
await asyncio.sleep(1)
print("World")
# 获取事件循环
loop = asyncio.get_event_loop()
# 运行协程
loop.run_until_complete(main())
# 关闭事件循环
loop.close()3. 实际应用场景
3.1 网络请求
import asyncio
import aiohttp
async def fetch_url(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
"https://api.github.com",
"https://api.example.com",
"https://api.google.com"
]
# 并发请求
tasks = [fetch_url(url) for url in urls]
results = await asyncio.gather(*tasks)
for url, result in zip(urls, results):
print(f"URL: {url}, Length: {len(result)}")
asyncio.run(main())3.2 文件 I/O
import asyncio
async def read_file(filename):
async with open(filename, 'r') as f:
content = await f.read()
return content
async def write_file(filename, content):
async with open(filename, 'w') as f:
await f.write(content)
async def main():
# 读取文件
content = await read_file('input.txt')
print(f"Read content: {content}")
# 写入文件
await write_file('output.txt', content.upper())
print("File written")
asyncio.run(main())3.3 数据库操作
import asyncio
import asyncpg
async def main():
# 连接数据库
conn = await asyncpg.connect(
host='localhost',
port=5432,
user='postgres',
password='password',
database='test'
)
# 执行查询
rows = await conn.fetch('SELECT * FROM users')
for row in rows:
print(row)
# 关闭连接
await conn.close()
asyncio.run(main())3.4 Web 服务器
import asyncio
from aiohttp import web
async def handle(request):
name = request.match_info.get('name', "Anonymous")
return web.Response(text=f"Hello, {name}!")
async def main():
app = web.Application()
app.add_routes([
web.get('/', handle),
web.get('/{name}', handle)
])
runner = web.AppRunner(app)
await runner.setup()
site = web.TCPSite(runner, 'localhost', 8080)
await site.start()
print("Server started on http://localhost:8080")
await asyncio.Event().wait()
asyncio.run(main())4. 最佳实践
- 使用
async和await:使用async定义异步函数,使用await等待异步操作完成。 - 使用
asyncio.create_task:使用asyncio.create_task创建任务,实现并发执行。 - 使用
asyncio.gather:使用asyncio.gather并发执行多个任务,收集结果。 - 使用
asyncio.wait_for:使用asyncio.wait_for设置超时,避免任务无限等待。 - 使用
async with:使用async with管理异步上下文,确保资源正确释放。 - 避免阻塞操作:在异步函数中避免使用阻塞操作,如
time.sleep(),应使用asyncio.sleep()替代。 - 合理使用事件循环:根据应用场景选择合适的事件循环运行方式。
5. 总结
asyncio 是 Python 中强大的异步 I/O 框架,它允许我们编写高效的并发代码。通过掌握 asyncio 的高级应用,我们可以编写更加高效、响应迅速的应用程序。
在实际应用中,asyncio 可以用于网络请求、文件 I/O、数据库操作、Web 服务器等多种场景,大大提高应用程序的并发性能和响应速度。
希望本文对你理解和应用 Python asyncio 有所帮助!
以上就是Python asyncio核心原理与高阶应用全解析的详细内容,更多关于Python asyncio的资料请关注脚本之家其它相关文章!
