当前位置:   article > 正文

自学 python 中的异步编程 asyncio:实战(四)同时使用线程和协程的websocket_async for message in websocket

async for message in websocket
  • 本代码在上一个实战的基础上添加上了线程技能,开辟了一个线程,在线程中运行协程任务
  • 实现了简单的websocket的通信
  • 代码并不难,注释很详细,直接阅读即可
server端
  • server 会接收client发来的消息,并微微修改,我这里是末尾添加感叹号,然后发回给client
import asyncio
import threading
import time

import websockets


async def handler(websocket, path):  # 定义一个异步函数handler,用于处理websocket通信
    print(f"[{time.asctime()} connected!]")
    async for message in websocket:  # 使用async for循环接收客户端发送的消息
        print(f"[{time.asctime()} from client]: " + message)
        await websocket.send(message + "!")  # 将客户端发送的消息加上感叹号后返回给客户端


async def server_my():
    async with websockets.serve(handler, "127.0.0.1", 8765, ping_interval=200, ping_timeout=200,
                                timeout=2000):  # 使用websockets.serve函数创建一个websocket服务器,并指定handler函数作为处理函数
        print(f"[{time.asctime()} Server on]")
        await asyncio.Future()  # 等待异步任务完成


def loop_in_thread(new_loop):  # 定义一个函数loop_in_thread,用于在新线程中启动事件循环
    asyncio.set_event_loop(new_loop)  # 将新事件循环设置为当前线程的事件循环
    new_loop.create_task(server_my())  # 在新事件循环中创建一个任务,并将server_my函数作为任务的执行函数
    new_loop.run_forever()  # 启动新事件循环


def start():  # 定义一个函数start,用于启动websocket服务器和事件循环
    new_loop = asyncio.new_event_loop()  # 创建一个新的事件循环

    t = threading.Thread(target=loop_in_thread, kwargs={"new_loop": new_loop})  # 创建一个新线程,并将loop_in_thread函数作为线程的执行函数
    t.start()

    asyncio.run_coroutine_threadsafe(server_my(), new_loop)  # 在当前线程中启动server_my异步任务,并等待任务完成


if __name__ == '__main__':
    start()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
client 端
  • client 我采用了两个协程任务,分别来处理发送和接收两个功能
import asyncio  # 引入asyncio模块,用于异步编程

import websockets  # 引入websockets模块,用于websocket通信


async def send(websocket):
    while True:
        message = input("请输入要发送的消息:")  # 获取用户输入的消息
        await websocket.send(message)  # 将用户输入的消息发送给服务器端
        await asyncio.sleep(1)  # 需要sleep才能保证其他协程任务能够运行,不然会阻塞接收消息的协程


async def receive(websocket):
    async for response in websocket:
        print(f"收到服务器端返回的消息:{response}")  # 打印服务器端返回的消息


async def main():
    async with websockets.connect("ws://localhost:8765") as websocket:  # 使用websockets.connect函数连接到服务器端
        await asyncio.gather(send(websocket), receive(websocket))  # 使用asyncio.gather函数同时运行send和receive协程


if __name__ == '__main__':
    asyncio.run(main())  # 启动事件循环并运行main协程

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/85304
推荐阅读
相关标签
  

闽ICP备14008679号