首页 > 解决方案 > 当另一个协程已经在等待下一条消息时,我不断收到错误无法调用 recv()

问题描述

当我运行我的 paddleLogic 函数两次时,我收到错误“无法调用 recv() 而另一个协程已经在等待下一条消息”即使我正在使用 await 来确保它们不会同时尝试接收。

我已经运行了代码而没有第二次调用 paddleLogic 函数,一切都按预期工作

    leftPaddlePos = await paddleLogic(websocket,leftPaddlePos)
    rightPaddlePos = await paddleLogic(opponent[websocket],rightPaddlePos)

async def paddleLogic(socket,pos):
        try:
            key = await asyncio.wait_for(socket.recv(),timeout=0.01)
            if key == "1" and pos > 0:
                pos = pos - 1
            elif key == "2" and pos < 60:
                pos = pos + 1
            time.sleep(0.003)
        except asyncio.TimeoutError:
            pos = pos
        return pos

抱歉,如果这篇文章有点乱,这是我第一次在 stackoverflow 上提问。如果您想要更多信息/代码,我很乐意提供。

标签: javascriptpythonwebsocket

解决方案


你从哪里得到你的插座?

我们拥有的是协程。它们被安排给彼此控制。他们打电话时让出控制权await。看来您socket.recv 还通过让出控制在幕后进行了一些等待,因此recv如果来自网络的数据不能立即可用,则输入两次。

我想你最好访问 asyncio event loop socket support。否则,我会使用并行select()查看两个('left paddle', -1)套接字,从我的异步生成器返回事件,并相应地更新游戏世界。

(我什至可以假设像乒乓球这样的实时游戏会更容易以完全同步的方式实现,由帧速率决定。)


推荐阅读