要允许超时通过Pythonwebsocket接收数据,FAQ: How do I set a timeout on recv()?建议使用异步接收数据:
await asyncio.wait_for(websocket.recv(), timeout=10)
由于我接收数据的函数不是异步的,因此我调整了this answer以运行asyncio循环,直到接收到数据或发生超时:
loop.run_until_complete(asyncio.wait_for(ws.recv(), timeout=10))
不幸的是,此语句似乎无效,因为出现以下异常:
An asyncio.Future, a coroutine or an awaitable is required
对我来说,asyncio.wait_for
似乎不是run_until_complete
的有效参数,尽管documentation清楚地显示了一个await
适用于它的示例
我在这里遗漏了什么?在同步方法中使用asyncio.wait_for
的正确方法是什么
您需要为
loop.run_until_complete
提供一个协同程序。为此,您可以将接收代码包装到异步函数中:下面是一个完整的工作代码:
Python中有两个常见的websocket模块。 虽然websockets是用
import websockets
导入的,但也有websocket-client是用import websocket
导入的这两个模块提供几乎相同的API,其中
ws.recv()
允许接收数据这些模块彼此如此相似的事实可能会导致混淆,这至少会导致我的异常
虽然websockets能够进行异步操作,但websocket却不能。这意味着我的声明
仅适用于websockets,如果与websocket一起使用,则例外
将会发生
相关问题 更多 >
编程相关推荐