Разница между сопрограммой и будущим / заданием в Python 3.5?
Допустим, у нас есть фиктивная функция:
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.5async
?
Для дополнительного кредита, что, если я хочу пакетировать звонки? Например, мне нужно позвонитьsome_remote_call(...)
1000 раз, но я не хочу сокрушать веб-сервер / базу данных / и т. Д. С 1000 одновременных соединений. Это выполнимо с потоком или пулом процессов, но есть ли способ сделать это сasyncio
?