javascript - 当另一个协程已经在等待下一条消息时,我不断收到错误无法调用 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 上提问。如果您想要更多信息/代码,我很乐意提供。
解决方案
你从哪里得到你的插座?
我们拥有的是协程。它们被安排给彼此控制。他们打电话时让出控制权await
。看来您socket.recv
还通过让出控制在幕后进行了一些等待,因此recv
如果来自网络的数据不能立即可用,则输入两次。
我想你最好访问 asyncio event loop socket support。否则,我会使用并行select()
查看两个('left paddle', -1)
套接字,从我的异步生成器返回事件,并相应地更新游戏世界。
(我什至可以假设像乒乓球这样的实时游戏会更容易以完全同步的方式实现,由帧速率决定。)
推荐阅读
- html - 在隐藏或打开时重绘引导模式
- django - 将元素添加到表时出现 django 管理错误(请更正以下错误)
- react-native - 如何分隔视图组件 React Native 的子项
- javascript - 反应-通过父级传递子状态时未定义状态
- json - PySpark 将 JSON 字符串分解为多列
- javascript - 如何使用 React 删除列表项(功能组件)
- html - 在引导程序中收缩和扩展 iframe 内容的网格
- java - 如何使用使用 Firestore 文档字段的 HashMap 键值并填充 recyclerview?
- swift - 假设键盘始终显示,可用于定位 UI 元素的高度
- r - 有条件地创建(变异)新列