Как взглянуть на то, завершится ли чтение сопрограммы мгновенно? - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь написать асиновый 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
...