Разница между сопрограммой и будущим / заданием в 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?

Ответы на вопрос(4)

Ваш ответ на вопрос