Есть ли способ проверить параметр, который я передал сопрограмме после ее ожидания? - PullRequest
0 голосов
/ 26 мая 2020

В настоящее время я использую asyncio для запуска некоторой программы в Python:

import asyncio
async def mycoro(number):
    print("Starting %d" % number)
    await asyncio.sleep(number)
    print("Finishing %d" % number)
    return str(number)

async def print_when_done(tasks):
    for res in asyncio.as_completed(tasks):
        print("Result %s" % await res)
        # here is there a way to print the argument that I entered to the task (mycoro(ARGUMENT))

async def run_command():
    print("This is the start of run command")
    print("This is one more line")
    coros = [mycoro(1), mycoro(2), mycoro(3)]
    await print_when_done(coros)

loop = asyncio.get_event_loop()
loop.run_until_complete(run_command())
loop.close()

Кажется, он работает хорошо. Как видите, я запускаю mycoro три раза одновременно и затем печатаю, когда задачи завершены.

Однако я дал некоторые задачи функции print_when_done. Эта функция печатает результаты функции (сопрограммы) mycoro. Мой вопрос: есть ли способ распечатать оттуда (строка, в которой я помещаю комментарий) аргумент, который я передал? Я хотел бы, например, сравнить, что результат 1 (строка) - это строка 1 (число) et c.

Я не знаю, возможно ли это.

1 Ответ

1 голос
/ 26 мая 2020

Мой вопрос: есть ли способ распечатать оттуда (строка, в которую я помещаю комментарий) аргумент, который я передал?

После того, как сопрограмма завершит выполнение, вы не может получить доступ к полученным аргументам, вы можете получить доступ только к его результату. Но если вам нужны аргументы, вы можете изменить сопрограмму, чтобы она возвращала их вместе с фактическим результатом. Например, вы можете изменить последнюю строку mycoro на:

    return number, str(number)

И затем, когда вы ждете этого, вы получите оба объекта:

    arg, result = await res
    print("Result %s for argument %s" % (result, arg))
...