当我两次运行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的问题。如果您需要更多信息/代码,我们很乐意提供。
答案 0 :(得分:0)
您在哪里获得插座?
我们拥有的是协程。它们由它们安排,以相互控制。他们在调用await
时产生控制权。您的socket.recv
似乎
还通过控制权在后台进行一些等待,因此,如果无法立即获得来自网络的数据,则两次输入recv
。
我想你会更好accessing asyncio event loop socket support。否则,我将使用select()
并行地查看两个套接字,从异步生成器返回诸如('left paddle', -1)
之类的事件,并相应地更新游戏世界。
(我什至可以假设像pong这样的实时游戏更容易以完全同步的方式(根据帧速率来定)实现。)