Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在WebSocket中使用多线程?_Python_Multithreading_Websocket - Fatal编程技术网

Python 如何在WebSocket中使用多线程?

Python 如何在WebSocket中使用多线程?,python,multithreading,websocket,Python,Multithreading,Websocket,我正在尝试使用多线程的websocket()。我想要的是在程序继续运行时继续获取数据,但是,当我按照下面的代码执行时,服务器不会从客户端接收任何连接。我以前在主线程上运行过它,它运行得很好 async def hello(websocket, path): while True: data = await websocket.recv() print(data) await websocket.send(data) def betwee

我正在尝试使用多线程的websocket()。我想要的是在程序继续运行时继续获取数据,但是,当我按照下面的代码执行时,服务器不会从客户端接收任何连接。我以前在主线程上运行过它,它运行得很好

async def hello(websocket, path):
    while True:
        data = await websocket.recv()
        print(data)
        await websocket.send(data)


def between_callback():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    ws_server = websockets.serve(hello, '192.168.0.115', 8899)
    
    loop.run_until_complete(ws_server)
    loop.close()

if __name__ == "__main__":
    _thread = threading.Thread(target=between_callback)
    _thread.start()

  # Do something in main thread

通常,在这些服务器/客户机程序中,您在主线程中接受连接,每个传入连接接收一个单独的其他线程。线程本身可能只是一个echo函数,但这种设计的巨大优势在于,您可以一次处理多个客户端,而不必等待另一个客户端收到它的响应。一个很好的方法是创建一个给定大小的线程池(比如说20),并在每个传入连接不是空的情况下从该池中分配一个线程。这样,您就可以在某种程度上控制使用了多少资源。

查看
websockets
示例程序,您似乎缺少了一条语句,
loop.run\u forever()
,这似乎起到了作用(为了测试,我还将IP地址更改为“localhost”):


def在_callback()之间:
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
ws_server=websockets.service(您好,'localhost',8899)
循环。运行_直到_完成(ws_服务器)
loop.run_forever()#缺少此项
loop.close()
演示程序

请注意更新的
hello
函数,该函数避免了websockets.exceptions.ConnectionClosedOK:code=1000(确定),终止时无原因异常,我怀疑这是由于守护进程线程的终止引起的

导入WebSocket
导入线程
导入异步
异步def hello(websocket,路径):
websocket中数据的异步:
打印(f“已接收:{data}'”)
等待websocket.send(数据)
def在_callback()之间:
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
ws_server=websockets.service(您好,'localhost',8899)
循环。运行_直到_完成(ws_服务器)
loop.run_forever()#缺少此项
loop.close()
异步def发送\接收\消息(uri):
与websocket异步。作为websocket连接(uri):
等待websocket.send('这是一些文本')
reply=wait websocket.recv()
打印(f“回复为:{reply}'”)
def client():
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
循环。运行直到完成(发送接收消息('ws://localhost:8899'))
loop.close()
如果名称=“\uuuuu main\uuuuuuuu”:
#守护进程服务器线程:
server=threading.Thread(target=between\u回调,daemon=True)
server.start()
客户端=线程。线程(目标=客户端)
client.start()
client.join()
印刷品:

Received: 'This is some text.'
The reply is: 'This is some text.'

你的主线程是做什么的?它在连接线吗?@KlausD。它使用从websocket接收的数据来做其他事情。我只有一个客户端连接到我的websocket,在接收数据时,我需要在主线程中做其他事情。