python库asyncio的概念和用法
python 库 asyncio
asyncio 是 Python 的标准库之一,用于编写异步应用程序。它提供了事件循环、协程、任务和其他工具来处理并发操作。以下是一些关于 asyncio 的基本概念和常见用法:
基本概念
- 协程 (Coroutine):
协程是一种特殊的函数,可以暂停执行并在稍后恢复。在 Python 中,协程通常通过 async def 定义。
async def my_coroutine():
print("Hello, World!")
- 事件循环 (Event Loop):
事件循环是 asyncio 的核心,负责管理和调度协程。可以通过 asyncio.run() 启动事件循环。
import asyncio
async def main():
await my_coroutine()
asyncio.run(main())
- 任务 (Task):
任务是协程的封装,可以在事件循环中调度和管理。可以通过 asyncio.create_task() 创建任务。
import asyncio
async def my_coroutine():
await asyncio.sleep(1)
print("Task completed")
async def main():
task = asyncio.create_task(my_coroutine())
await task
asyncio.run(main())
常见用法
- 并发执行多个协程:
使用 asyncio.gather() 可以并发执行多个协程,并等待所有协程完成。
import asyncio
async def my_coroutine(id):
await asyncio.sleep(1)
print(f"Coroutine {id} completed")
async def main():
coroutines = [my_coroutine(i) for i in range(3)]
await asyncio.gather(*coroutines)
asyncio.run(main())
- 超时控制:
使用 asyncio.wait_for() 可以设置协程的超时时间。
import asyncio
async def my_coroutine():
await asyncio.sleep(10)
print("This should not be printed")
async def main():
try:
await asyncio.wait_for(my_coroutine(), timeout=5)
except asyncio.TimeoutError:
print("Coroutine timed out")
asyncio.run(main())
- 异步 I/O 操作:
asyncio 提供了异步 I/O 操作的支持,例如 aiohttp 库可以用于异步 HTTP 请求。
import asyncio
import aiohttp
async 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, 'https://example.com')
print(html)
asyncio.run(main())
异常处理
在 asyncio 中,异常处理与同步代码类似,但需要注意的是,协程中的异常需要在 await 时捕获。
import asyncio
async def my_coroutine():
raise ValueError("An error occurred")
async def main():
try:
await my_coroutine()
except ValueError as e:
print(f"Caught an exception: {e}")
asyncio.run(main())
希望这些示例和解释能帮助你更好地理解和使用 asyncio。
感谢您的认真阅读,更多内容请查看:
出处:http://www.cnblogs.com/weiqinl
个人主页http://weiqinl.com
github: weiqinl
简书:weiqinl
您的留言讨论是对博主最大的支持!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/weiqinl
个人主页http://weiqinl.com
github: weiqinl
简书:weiqinl
您的留言讨论是对博主最大的支持!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。