Когда я запускаю свою функцию 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. В противном случае я использовал бы select()
для параллельного просмотра обоих сокетов, возвратил события вроде ('left paddle', -1)
из моего асинхронного генератора и соответствующим образом обновил игровой мир.
(Я могу даже предположить, что игру в реальном времени, такую как понг, было бы проще реализовать полностью синхронно, с частотой кадров.)