目录
1、应用场景
Python的asyncio库被设计用于处理并发和异步编程,同时提供了基于协程的高级API,以在处理一些I/O密集型操作时提供更好的性能和易用性。
其主要应用场景有:
- 开发服务器应用: 有很多服务器应用,比如web服务、api服务等等,需要高并发,异步处理请求,这时候就非常适合用asyncio实现。
- 网络爬虫: 网络爬虫需要发起大量网络请求,使用asyncio可以大大提高网络爬虫的效率。
- 实时处理系统: 例如GUI系统、游戏、实时数据处理等,需要对多个任务进行并发处理。
- 微服务和REST APIs:这些场景需要处理大量并发的网络连接,并且需要快速响应。
- WebSockets和其他长连接协议: 使用asyncio来管理大量的长连接。
asyncio库提供的事件循环、协程和任务等都可以方便地实现这些功能。
2、asyncio-标准库
asyncio是Python的标准库,从Python 3.4版本开始引入,用于编写单线程的并发代码,主要通过协程来实现。asyncio提供了一种通过使用 async/await 语法编写并发代码的方法。这是异步I/O(即非阻塞I/O)的一种方式,为 Python 提供了异步框架。
Python asyncio库的常用方法和对象有:
- asyncio.run(coro, *, debug=False): 用于执行协程,此函数总是会创建一个新的事件循环并在结束时关闭之。
- asyncio.create_task(coro, *, name=None): 将协程包装为 Task 对象并安排其运行。
- asyncio.sleep(delay, result=None, *, loop=None): 阻塞 delay 指定的秒数。
- asyncio.get_event_loop(): 获取当前事件循环。
- loop.run_until_complete(future): 将 future 参数运行至完成,返回 future 的结果。
- loop.run_forever(): 运行事件循环直至 stop() 方法被调用。
- asyncio.wait(futures, *, loop=None, timeout=None, return_when=ALL_COMPLETED): 这个函数接收一个 Future 或协程对象的可迭代对象,返回一个聚合了所有 Future 对象的单个 Future 对象。
- asyncio.gather(*coros_or_futures, loop=None, return_exceptions=False): 这个函数接收一些协程或 Future 对象,返回一个所有协程或 Future 对象都完成后的 Future 对象。
- asyncio.open_connection(host=None, port=None, *, loop=None, limit=None, **kwds): 这个函数用于打开一个网络连接。
python复制代码
reader, writer = await asyncio.open_connection("127.0.0.1", 8888)
- asyncio.start_server(client_connected_cb, host=None, port=None, *, loop=None, **kwds): 这个函数用于启动一个套接字服务器。
reader, writer = await asyncio.open_connection("127.0.0.1", 8888)
这些都是针对异步IO的操作,使用时需要配合 async/await 关键字。
async和await是Python用于处理异步编程的关键字。在Python中,await可以在协程函数内部用于等待一个耗时的IO操作完成,而async则用于定义一个协程函数。
下面是一个简单的例子:
import asyncio
async def main():
print('hello')
await asyncio.sleep(1) # 等待1秒钟,此时可以切换到其他协程执行
print('world')
# 调用上面定义的协程函数
asyncio.run(main())
在这段代码中,main函数就是一个协程函数。在这个函数内部,我们调用了await asyncio.sleep(1),这会将程序的执行权交由事件循环,等待1秒钟后,事件循环会重新激活这个协程,继续执行下面的代码。
需要注意的是,async和await必须配套使用,你不能在一个非协程函数(没有用async定义的函数)中使用await或者在一个非协程上下文(如普通的函数或方法)中使用async。