У меня есть Vec
фьючерса, созданного в результате вызова функции async
. После добавления всех фьючерсов к вектору, я хотел бы подождать весь набор, получая либо список результатов, либо обратный вызов для каждого, который заканчивается.
Я мог бы просто l oop или итерируйте вектор фьючерсов и вызывайте .await
в каждом будущем, и это позволило бы мне правильно обрабатывать ошибки, а не futures::future::join_all
отменять другие, но я уверен, что есть идиоматизм c способ выполнить sh эту задачу.
Я также хочу иметь возможность обрабатывать фьючерсы по мере их завершения, поэтому, если я получу достаточно информации из первых нескольких, я могу отменить оставшиеся неполные фьючерсы и не ждать для них и отбросить их результаты, ошибка или нет. Это было бы невозможно, если бы я перебрал вектор по порядку.
Мне нужен обратный вызов (closure, et c), который позволяет мне накапливать результаты по мере их поступления, чтобы я мог может обрабатывать ошибки надлежащим образом или отменять оставшуюся часть фьючерсов (из-за обратного вызова), если я решу, что остальные из них мне не нужны.
Я могу сказать, что запрашивает головную боль у средства проверки заимствований: попытка изменить будущее в Vec
в обратном вызове из асинхронного двигателя c.
Существует множество вопросов о переполнении стека и публикациях Reddit, в которых объясняется, как join_all
включается в список фьючерсов, но отменяется остальное - в случае отказа, и как асинхронные c движки могут порождать потоки, а могут - нет или плохой дизайн, если они это делают.