Приветствую!
Пишу на питоне интеграцию одного девайса с сервером умного дома home-assistant. Там повсюду asyncio и вечно сталкиваюсь с гонкой доступа к TCP-соединению.
Обмен данными с девайсом происходит в виде текстового чатика по одному TCP-соединению, а стиль програмирования под homeassistant заставляет вкидывать в eventloop таски, не дожидаясь завершения их выполнения..
Условно говоря, есть метод
async def send_command(self, cmd):
self._cmd_wrter.write(cmd + b'\r\n')
await self._cmd_wrter.drain()
buf: bytes = await self._cmd_reader.readline()
...
Но, из-за специфики homeassistant, работать с этим методом приходится без await. Грубо говоря:
def callback():
asyncio.ensure_future(device.send_command("SOME COMMAND"))
callbacks = [callback, callback]
for callback in callbacks:
callback()
Вылетает ошибка readuntil() called while another coroutine is already waiting for incoming data. Я так понимаю, из-за попытки одновременного вызова readline() из нескольких корутин
Подскажите, что тут можно поделать? Может как-то переписать send_command, чтобы она обрабатывала все запросы последовательно? Хотя вроде перед readline() и так стоит await.. Не могу сообразить.