我不断收到错误消息,而另一个协程已经在等待下一条消息,则无法调用recv()

时间:2018-12-22 22:19:52

标签: javascript python websocket

当我两次运行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的问题。如果您需要更多信息/代码,我们很乐意提供。

1 个答案:

答案 0 :(得分:0)

您在哪里获得插座?

我们拥有的是协程。它们由它们安排,以相互控制。他们在调用await时产生控制权。您的socket.recv似乎  还通过控制权在后台进行一些等待,因此,如果无法立即获得来自网络的数据,则两次输入recv

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

(我什至可以假设像pong这样的实时游戏更容易以完全同步的方式(根据帧速率来定)实现。)