#python-asyncio
Вопрос:
Используя этот пример
import time import asyncio async def main(x): print(f"Starting Task {x}") await asyncio.sleep(3) print(f"Finished Task {x}") async def async_io(): tasks = [] for i in range(10): tasks = [main(i)] await asyncio.gather(*tasks) if __name__ == "__main__": start_time = time.perf_counter() asyncio.run(async_io()) print(f"Took {time.perf_counter() - start_time} secs")
Я заметил, что нам нужно создать список, который отслеживает выполняемые задачи. Понятно, но тогда зачем мы добавляем оболочку [] поверх основной(i) функции? А также в asyncio.gather(*задачи), почему нам также нужно добавить звездочку туда?
Ответ №1:
почему мы добавляем оболочку [] поверх основной(i) функции?
Существует несколько способов добавления элементов в список. Один из таких способов, который вы выбрали, заключается в объединении двух списков вместе.
gt;gt;gt; [1] [2] [1, 2]
Попытка объединить список и что-то еще приведет к TypeError
.
В вашем конкретном случае вы используете расширенное назначение, (часто более эффективное) сокращение для
tasks = tasks [main(i)]
Другой способ добиться этого-с append
помощью .
tasks.append(main(i))
Если ваш реальный код совпадает с вашим примером кода, еще лучший способ написать все это —
tasks = [main(i) for i in range(10)]
в asyncio.gather(*задачи), почему нам также нужно добавить звездочку туда?
Потому gather
что будет запускать каждый позиционный аргумент, который он получает. Звонки на gather
должны выглядеть так
asyncio.gather(main(0)) asyncio.gather(main(0), main(1))
Поскольку бывают случаи, когда вам нужно использовать переменное количество позиционных аргументов, Python предлагает оператор распаковки ( *
в случае списков).
Если вы почувствовали такое желание, ваш пример можно переписать следующим образом
async def async_io(): await asyncio.gather(*[main(i) for i in range(10)])