Скажем, у нас есть фиктивная функция:
async def foo(arg):
result = await some_remote_call(arg)
return result.upper()
Какая разница между:
coros = []
for i in range(5):
coros.append(foo(i))
loop = get_event_loop()
loop.run_until_complete(wait(coros))
и
from asyncio import ensure_future
futures = []
for i in range(5):
futures.append(ensure_future(foo(i)))
loop = get_event_loop()
loop.run_until_complete(wait(futures))
Примечание. В примере возвращается результат, но это не является предметом обсуждения. Когда значение возвращает значение, используйте gather()
вместо wait()
.
Независимо от возвращаемого значения, я ищу ясность в ensure_future()
. wait(coros)
и wait(futures)
оба запускают сопрограммы, поэтому, когда и почему сопрограмма должна быть завернута в ensure_future
?
В принципе, какой правильный путь (tm) запускает кучу неблокирующих операций с использованием Python 3.5 async
?
Для дополнительного кредита, что, если я хочу, чтобы пакетные звонки? Например, мне нужно вызвать some_remote_call(...)
1000 раз, но я не хочу раздавить веб-сервер/базу данных /etc с 1000 одновременными подключениями. Это можно выполнить с помощью потока или пула процессов, но есть ли способ сделать это с помощью asyncio
?