Python3 网络编程2:asyncio 异步网络编程
Python 提供 asyncio 进行异步编程,适用于高并发网络应用,如 聊天服务器、WebSocket 服务器、爬虫 等。
2.1 asyncio 基础
在 asyncio 中:
async def定义异步函数。await用于等待异步操作。asyncio.run()运行主事件循环。
示例:
import asyncio
async def hello():
print("Hello, asyncio!")
await asyncio.sleep(1)
print("Goodbye, asyncio!")
asyncio.run(hello())
2.2 asyncio TCP 服务器
asyncio 提供 asyncio.start_server() 轻松创建 TCP 服务器。
2.2.1 asyncio TCP 服务器
import asyncio
async def handle_client(reader, writer):
addr = writer.get_extra_info('peername')
print(f"客户端 {addr} 连接成功")
# 读取客户端数据
data = await reader.read(1024)
print(f"收到数据:{data.decode()}")
# 发送响应
writer.write(b"Hello from asyncio server!")
await writer.drain() # 确保数据发送完成
writer.close()
await writer.wait_closed()
async def main():
server = await asyncio.start_server(handle_client, "0.0.0.0", 12345)
print("Asyncio TCP 服务器已启动")
async with server:
await server.serve_forever()
asyncio.run(main())
2.2.2 asyncio TCP 客户端
import asyncio
async def tcp_client():
reader, writer = await asyncio.open_connection("127.0.0.1", 12345)
# 发送数据
writer.write(b"Hello Asyncio Server!")
await writer.drain()
# 接收数据
data = await reader.read(1024)
print(f"服务器响应:{data.decode()}")
writer.close()
await writer.wait_closed()
asyncio.run(tcp_client())
2.3 asyncio UDP 服务器
UDP 适用于高吞吐、低延迟的场景,如 在线游戏、直播。
2.3.1 asyncio UDP 服务器
import asyncio
class UDPServerProtocol:
def connection_made(self, transport):
self.transport = transport
def datagram_received(self, data, addr):
print(f"收到来自 {addr} 的数据:{data.decode()}")
self.transport.sendto(b"Hello from asyncio UDP Server!", addr)
async def main():
loop = asyncio.get_running_loop()
listen = await loop.create_datagram_endpoint(
lambda: UDPServerProtocol(),
local_addr=('0.0.0.0', 12345)
)
print("Asyncio UDP 服务器已启动")
await asyncio.sleep(3600) # 让服务器运行 1 小时
asyncio.run(main())
2.3.2 asyncio UDP 客户端
import asyncio
async def udp_client():
loop = asyncio.get_running_loop()
transport, _ = await loop.create_datagram_endpoint(
lambda: asyncio.DatagramProtocol(),
remote_addr=("127.0.0.1", 12345)
)
transport.sendto(b"Hello Asyncio UDP Server!")
asyncio.run(udp_client())
2.4 asyncio 并发任务
多个异步任务并行执行:
import asyncio
async def task1():
await asyncio.sleep(1)
print("Task 1 完成")
async def task2():
await asyncio.sleep(2)
print("Task 2 完成")
async def main():
await asyncio.gather(task1(), task2())
asyncio.run(main())
下篇文章深入 requests、http.server 进行 HTTP 网络编程,并介绍 WebSocket!请关注下篇文章!