【问题标题】:Starting websocket server in different thread/event loop在不同的线程/事件循环中启动 websocket 服务器
【发布时间】:2019-09-26 19:33:17
【问题描述】:

我正在 python 3 中构建一个 Websocket 服务器应用程序。我正在使用这个实现:https://websockets.readthedocs.io/

基本上我想使用不同的线程在同一个进程中启动服务器和客户端。

这是我的代码。服务器似乎启动了,但客户端没有连接。

我做错了什么?

纪尧姆

import asyncio
import websockets
import socket
from threading import Thread

async def hello(websocket, path):
    name = await websocket.recv()
    print(f"< {name}")
    greeting = f"Hello {name}!"
    await websocket.send(greeting)
    print(f"> {greeting}")

def start_loop(loop):
    asyncio.set_event_loop(loop)
    loop.run_forever()

# Get host and port from config file
server_host = socket.gethostname()
server_port = 8081  # random.randint(10000, 60000)

print('server_host: ' + server_host)

# start a new event loop
new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()

start_server = websockets.serve(hello, server_host, server_port, loop=new_loop)

print("Server launched")

async def hello():
    uri = "ws://{}:{}".format(server_host, server_port)
    async with websockets.connect(uri) as websocket:
        name = input("What's your name? ")

        await websocket.send(name)
        print(f"> {name}")

        greeting = await websocket.recv()
        print(f"< {greeting}")

asyncio.get_event_loop().run_until_complete(hello())

【问题讨论】:

    标签: python multithreading websocket


    【解决方案1】:

    问题是您首先启动了后台线程,然后尝试使用它(作为一般原则,首先设置您的对象,然后启动线程)。另一个问题是您没有像示例中那样调用run_until_complete

    所以要修复:

    (1)根据websockets例子修复start_loop函数,所以代码变成了

    def start_loop(loop, server):
        loop.run_until_complete(server)
        loop.run_forever()
    

    (2) 在启动后台线程之前设置你的服务器对象:

    new_loop = asyncio.new_event_loop()
    start_server = websockets.serve(hello, server_host, server_port, loop=new_loop)
    t = Thread(target=start_loop, args=(new_loop, start_server))
    t.start()
    

    最后,在尝试连接到服务器之前,先休眠一会儿,让服务器开始监听(理想情况下,您会有更好的同步机制,但大部分时间都可以短暂休眠):

    print("Server launched")
    # give some time for server to start, before we try to connect
    time.sleep(2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      相关资源
      最近更新 更多