Python异步编程精要:asyncio、协程,拥抱事件驱动编程
发布时间: 2024-06-23 03:29:54 阅读量: 10 订阅数: 11 ![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![Python异步编程精要:asyncio、协程,拥抱事件驱动编程](https://img-blog.csdnimg.cn/20210422154632271.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MTk4NDM2,size_16,color_FFFFFF,t_70)
# 1. Python异步编程概述
异步编程是一种编程范式,允许在不阻塞主线程的情况下执行耗时操作。在Python中,asyncio模块提供了用于编写异步代码的工具。异步编程的主要优点包括:
- **提高响应能力:**异步代码可以处理并发请求,而不会阻塞主线程,从而提高应用程序的响应能力。
- **利用多核处理器:**异步代码可以同时在多个内核上执行任务,从而充分利用多核处理器的优势。
- **降低资源消耗:**异步代码不需要创建和管理线程,因此可以降低资源消耗。
# 2. asyncio模块详解
### 2.1 asyncio事件循环与任务
**事件循环**
asyncio事件循环是一个无限循环,负责调度和执行协程和回调函数。它不断地从事件队列中获取事件,并调用相应的处理函数。
**任务**
任务是asyncio中执行并发操作的单元。任务可以是协程或回调函数。协程是异步函数,而回调函数是同步函数。
### 2.2 协程与异步函数
**协程**
协程是允许在不阻塞的情况下暂停和恢复执行的函数。协程使用`async`和`await`关键字。
```python
async def my_coroutine():
await asyncio.sleep(1) # 暂停协程 1 秒
print("Hello, world!")
```
**异步函数**
异步函数是协程的语法糖。它们使用`async def`关键字定义,并返回一个协程对象。
```python
async def my_async_function():
await asyncio.sleep(1)
print("Hello, world!")
```
### 2.3 asyncio中的常用API
**创建事件循环**
```python
loop = asyncio.new_event_loop()
```
**调度任务**
```python
loop.create_task(my_coroutine())
```
**运行事件循环**
```python
loop.run_until_complete(my_coroutine())
```
**其他常用API**
* `asyncio.gather()`:等待多个协程完成
* `asyncio.wait()`:等待多个协程完成,并返回已完成协程的结果
* `asyncio.sleep()`:暂停协程一段时间
* `asyncio.Lock()`:用于同步访问共享资源的锁
* `asyncio.Semaphore()`:用于限制并发访问共享资源的信号量
**代码块示例**
```python
import asyncio
async def my_coroutine():
await asyncio.sleep(1)
print("Hello, world!")
async def main():
task = asyncio.create_task(my_coroutine())
await task
asyncio.run(main())
```
**逻辑分析**
此代码创建一个事件循环,调度一个协程,然后运行事件循环。协程暂停 1 秒,然后打印消息。
**参数说明**
* `asyncio.sleep(1)`:暂停协程 1 秒。
* `asyncio.create_task(my_coroutine())`:创建一个协程任务。
* `await task`:等待协程任务完成。
* `asyncio.run(main())`:运行事件循环。
# 3. 异步编程实践
### 3.1 异步网络编程
#### 3.1.1 TCP服务器和客户端
**TCP服务器**
```python
import asyncio
async def handle_echo(reader, writer):
data = await reader.read(1024)
if not data:
return
writer.write(data)
await writer.drain()
async def main():
server = await asyncio.start_server(handle_echo, '127.0.0.1', 8888)
await server.serve_forever()
asyncio.
```
0
0
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)