Python3 网络编程2:asyncio 异步网络编程
                           
天天向上
发布: 2025-03-16 12:10:26

原创
498 人浏览过

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())

下篇文章深入 requestshttp.server 进行 HTTP 网络编程,并介绍 WebSocket!请关注下篇文章!

发表回复 0

Your email address will not be published. Required fields are marked *