Получить параметры из сопрограммы, созданной с помощью asyncio.as_completed - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь выполнять сложные задачи ввода-вывода одновременно:

import asyncio


async def io_operation(param: int):
    await asyncio.sleep(1)
    return param ** 2


async def main():
    io_calls = [io_operation(i) for i in range(10)]

    for i in asyncio.as_completed(io_calls):
        result = await i
        print(result)  # should also return the corresponding call parameters


if __name__ == '__main__':
    asyncio.run(main())

Теперь, поскольку я не могу заранее знать, в каком порядке будут результаты, я бы хотел получить информацию о параметрах вызова сопрограммы, возвращаемых asyncio.as_completed. Есть ли способ сделать это, не требующий возврата параметров в функции io_operation()?

Редактировать: Я отправляю HTTP-запросы с различными параметрами на сайт, используя aiohttp. После этого мне нужно сопоставить результаты с исходными запросами.

1 Ответ

1 голос
/ 27 февраля 2020

Вы можете использовать asyncio.gather для сохранения порядка:

import asyncio


async def io_operation(param: int):
    await asyncio.sleep(1)
    return param ** 2


async def main():
    r = range(10)
    io_calls = [io_operation(i) for i in r]

    for param, result in zip(r, await asyncio.gather(*io_calls)):
        print(param, result)


if __name__ == '__main__':
    asyncio.run(main())

Но если вам нужны результаты, как только они будут готовы, просто верните param:

import asyncio


async def io_operation(param: int):
    await asyncio.sleep(1)
    return (param, param ** 2)


async def main():
    io_calls = [io_operation(i) for i in range(10)]

    for i in asyncio.as_completed(io_calls):
        param, result = await i
        print(param, result)


if __name__ == '__main__':
    asyncio.run(main())
...