Я пытаюсь написать асиновый c мост между двумя мессенджерами, скажем, IR C и Telegram. Вот мой код, который пока не работает:
import asyncio
import logging
import random
async def read_from_irc(sock):
n = random.randint(1, 5)
await asyncio.sleep(n)
return "read_from_irc" + str(n)
async def read_from_telegram(sock):
n = random.randint(1, 5)
await asyncio.sleep(n)
return "read_from_telegram" + str(n)
async def main():
sock1 = await connect_to_irc()
sock2 = await connect_to_telegram()
while True:
w1 = read_from_irc(sock1)
w2 = read_from_telegram(sock2)
waits = {w1, w2}
done, pending = await asyncio.wait(waits)
print(done)
print(pending)
if w1 in done:
msg = await w1
await write_to_telegram(msg)
if w2 in done:
await write_to_irc(msg)
if __name__ == '__main__':
logging.basicConfig(level='DEBUG')
asyncio.run(main())
Моя проблема в том, что в действительности read_from_ir c () и read_from_telegram () выполняют функции read (), которые могут блокировать, если нет данных ожидание. Иногда я хочу послать сообщение из IR C в Telegram, иногда наоборот, поэтому я думаю, что мне нужно знать, когда подходящий момент для чтения из IR C и когда в Telegram ожидают какие-то данные. Как определить это в этом примере? Это ошибка, которую я пытаюсь избежать:
RuntimeError: readuntil() called while another coroutine is already waiting for incoming data