Это разные (хотя и связанные) идеи с разным количеством силы.
A future - это абстракция, которая позволяет начать процесс и затем вернуться к обработчику, который выбран исходным вызывающим абонентом, когда процесс завершится.
A генератор является более мощным, чем будущее, потому что он может давать несколько раз. Вы можете реализовать фьючерсы поверх генераторов.
A сопрограмма является более мощным, чем генератор, потому что он может выбирать, кому уступать, а не только вызывающему. Например, он может уступить другому сопрограмму. Вы можете реализовать генераторы поверх сопрограмм.
Зачем вам использовать менее мощный инструмент, если доступны более мощные? Иногда менее мощный инструмент является правильным инструментом для работы. Полезно статически кодировать инварианты вашей программы, используя типы, потому что это может дать вам уверенность в том, что что-то не может сделать.
Например, при выполнении вызова REST на удаленном сервере, вероятно, достаточно будущего. Если клиент REST выставил генератор, вам пришлось бы иметь дело с возможностью того, что он может дать несколько раз, даже если вы знаете, что будет только один результат. Если он выявит сопрограмму, вам придется обратиться к документации, чтобы точно определить, как вы должны взаимодействовать с ней - даже если вам действительно нужно сделать только одну вещь, что очевидно, когда вы имеете дело с будущим .