Три способа выполнить множество задач с asyncio
Функция для примера:
async def do_it(n):
await asyncio.sleep(random.uniform(0.5, 1))
return n
1. Последовательный вызов
async def main():
for i in range(100):
result = await do_it(i)
Такой вызов имеет смысл только тогда, когда результат одной задачи требуется для вызова следующей.
Если они независимы, то это антипаттерн, так как аналогичен простому синхронному вызову по очереди.
2. Упорядоченный результат
async def main():
tasks = [do_it(i) for i in range(100)]
results = await asyncio.gather(*tasks)
Выполняет корутины конкурентно и возвращает результат в виде списка.
Полезен когда требуется получить результаты в том же порядке в котором задачи отправлены.
3. Результат по мере готовности
tasks = [asyncio.create_task(do_it(i)) for i in range(100)]
for cor in asyncio.as_completed(tasks):
result = await cor
Так же выполняет корутины конкурентно, но не гарантирует порядок. Результат возвращается по мере готовности, каждый отдельно.
Полезен когда нужно обработать любой ответ как можно скорее.
#async
被 Covid 偷走的五年
我依旧觉得 2019 年是去年,要不是写博客梳理我都不知道我干了这么多事。我说什么来着,博客给记忆增加了一个全新的维度,是最好的时间胶囊。
下一个 5 年就是 2030 了,we're literally already closer to 2050 than 2000, can you even imagine?
本文是我 2024 年 8 月 Patreon 的月度选题。本月两个命题平票,由至尊糖妈的双倍票数 tie breaker 所以选了这个话题。加入 patreon 可以跟其它赞助者一起选出下个月你想看的博客文章,并且支持本博客的持续创作。下期选题已经发布欢迎金主点击投票:
- My pet peeves
- Mid 30s vs Mid 20s
- What's your fun fact
#blog#patreon