关键代码结构与asyncio
API使用
- 导入
asyncio
库
import asyncio
- 定义异步函数来处理与单个服务器的连接和数据交互
async def handle_connection(server_address):
reader, writer = await asyncio.open_connection(*server_address)
try:
# 发送数据
writer.write(b'Hello, server!')
await writer.drain()
# 接收数据
data = await reader.read(1024)
print(f"Received from {server_address}: {data.decode()}")
finally:
writer.close()
await writer.wait_closed()
- 主函数中创建多个任务并运行事件循环
async def main():
server_addresses = [('127.0.0.1', 8888), ('127.0.0.1', 8889)] # 多个服务器地址
tasks = [handle_connection(address) for address in server_addresses]
await asyncio.gather(*tasks)
if __name__ == "__main__":
asyncio.run(main())
优势
- 更高的效率:传统单线程实现需要依次处理与每个服务器的连接和数据交互,在等待I/O操作(如接收数据)时会阻塞线程,浪费时间。而
asyncio
的异步I/O操作允许在等待I/O时切换到其他任务,充分利用CPU时间,提高整体效率。
- 资源利用率高:无需为每个连接创建单独的线程或进程,减少了资源开销(如线程创建和上下文切换的开销),适用于处理大量并发连接的场景。
- 代码简洁:通过异步/等待(
async
/await
)语法,代码结构更清晰,相比于使用多线程或多进程实现并发,减少了复杂的锁机制和同步问题,更易于理解和维护。