\
asyncio
是Python的标准库,用于编写单线程的并发代码。它使用async
和await
语法来定义和调用异步函数,使得I/O密集型程序能够更有效地使用资源。
asyncio
的主要特点
- 事件循环:
asyncio
程序由事件循环驱动,它负责调度协程的执行。 - 协程:使用
async
定义的异步函数被称为协程。 - 任务:
asyncio
中的任务是协程的执行单元,可以通过asyncio.create_task()
创建。 - 异步I/O:支持异步的socket编程和文件I/O。
- 同步原语:提供锁、事件、条件变量等同步原语的异步版本。
常用asyncio
函数及其参数
asyncio.run()
运行异步程序的顶层入口点。
main
: 要运行的协程函数。debug
: 是否开启调试模式。
asyncio.create_task()
创建一个新的任务。
coro
: 要执行的协程对象。
asyncio.sleep()
协程的暂停,类似于time.sleep()
,但不会阻塞事件循环。
delay
: 暂停的时间(秒)。
asyncio.wait()
等待多个协程完成。
aws
: 要等待的协程列表。
asyncio.gather()
并发运行多个协程。
*aws
: 要并发运行的协程列表。return_exceptions
: 是否在异常时返回异常对象。
asyncio.open_connection()
创建异步的TCP连接。
host
: 服务器地址。port
: 服务器端口。loop
: 事件循环。
asyncio.start_server()
启动异步的TCP服务器。
handler
: 处理客户端连接的协程函数。host
: 服务器地址。port
: 服务器端口。
示例
以下是一个使用asyncio
进行异步网络请求的示例:
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, 'http://python.org')
print(html)
asyncio.run(main())
在这个示例中,我们定义了一个fetch
协程函数来异步获取网页内容。main
函数创建了一个aiohttp.ClientSession
会话,并使用fetch
函数获取了python.org
的HTML内容。
结论
asyncio
是Python中进行异步编程的核心库,它提供了一套完整的工具来编写高效的并发代码。