gpt4 book ai didi

python - websocket.recv() 永远不会在另一个事件循环中返回

转载 作者:太空宇宙 更新时间:2023-11-03 12:04:09 26 4
gpt4 key购买 nike

我目前正在用 Python 开发一个使用 websockets 和 asyncio 包的服务器程序。

我得到了一个处理 websockets 的基本脚本(图表 A)。此脚本在等待输入时锁定,这不是我想要的。

我想象的解决方案是我可以启动两个异步任务 - 一个处理输入,一个处理输出 - 并在辅助事件循环中启动它们。我必须对协程进行一些研究,然后我想出了 Exhibit B 作为在事件循环中同时运行两个事物的概念证明。

现在我坚持的是图表 C。当我尝试在 websockets 包的实际场景中使用它时,我发现 websocket.recv() 永远不会完成(或者协程永远不会取消暂停 - 我'我不确定到底发生了什么)。在展示 A 中,它工作正常,我确定协程肯定至少运行到那个点。

有什么想法吗?

图表 A:

#!/usr/bin/python3

import asyncio
import websockets
import time

# This works great!
async def hello(websocket, path):
while True:
# This line waits for input from socket
name = await websocket.recv()
print("< {}".format(name))

# "echo... echo... echo... echo... echo..."
greeting = ''.join(name + "... " for x in range(5))
await websocket.send(greeting)
print("> {}".format(greeting))

time.sleep(0.1);

start_server = websockets.serve(hello, '', 26231)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

图表 B:

#!/usr/bin/python3
import asyncio
import time

class Thing:
def __init__(self):
pass
async def test(self):
for x in range(10):
print("Hello"+str(x))
await asyncio.sleep(0)
def run(self):
# Add the task to the event loop twice
asyncio.ensure_future(self.test())
asyncio.ensure_future(self.test())

t = Thing()
t.run()

loop = asyncio.get_event_loop();
loop.run_forever()

图表 C:

#!/usr/bin/python3
import asyncio
import websockets
import time

class WebsocketRequest:
def __init__(self, websocket):
self.websocket = websocket

# Works great
async def handle_oputs(self):
# This works fine - sends a message
# every 10 seconds to the client
while True:
print("sending...")
await self.websocket.send("Hello")
print("> {}".format("Hello"))
time.sleep(10)

# Doesn't work
async def handle_iputs(self):
# This stops at the await and never receives
# any input from the client :/
while True:
try:
print("receiving...")
# This is the line that causes sadness
data = await self.websocket.recv()
print("< {}".format(data))
except:
# This doesn't happen either
print("Listener is dead")

async def run(self):

# This is the part where the coroutine for
# a client get split off into two of them
# to handle input and output separately.
loop = asyncio.new_event_loop()

asyncio.set_event_loop(loop)
asyncio.ensure_future(self.handle_iputs())
asyncio.ensure_future(self.handle_oputs())

loop.run_forever()

class WebsocketServer:
def __init__(self, address):
self.ip = address[0]
self.port = address[1]


async def hello(self, websocket, path):
req = WebsocketRequest(websocket)
await req.run()

def run(self):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

start_server = websockets.serve(self.hello, self.ip, self.port)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

最佳答案

也许 websocket 模块(与 websockets 不同)可以帮助您。

WebsocketApp的使用非常简单:

from websocket import WebSocketApp    

class ExampleClass(object):
def __init__(self):
websocket.enableTrace(True)
self.ws = websocket.WebSocketApp("ws://echo.websocket.org",
on_message=on_message,
on_error=on_error,
on_close=on_close)

def on_message(ws, msg):
print "Message Arrived:" + msg

def on_error(ws, error):
print error

def on_close(ws):
print "Connection Closed"

def on_open(ws):
ws.send("Hello!")

要下载此模块:https://pypi.python.org/pypi/websocket-client

关于python - websocket.recv() 永远不会在另一个事件循环中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37663560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com