Мне кажется, я понимаю, что вы имеете в виду.
Допустим, у вас есть две задачи: основная и рабочая1, в этом случае вы опрашиваете рабочий1, чтобы дождаться ответа; НО есть лучший способ, и это ждать соревнования Worker1; и это может быть сделано без какого-либо будущего, вы просто вызываете из Main функцию Worker1, когда рабочий по окончании Main продолжится. Вам не нужно будущее, вы просто вызываете функцию, а разделение Main и Worker1 - просто чрезмерное усложнение.
Теперь, я думаю, ваш вопрос стал актуальным в тот момент, когда вы добавили хотя бы другого работника, в последний раз добавили Worker2, и вы хотите, чтобы Main возобновил вычисления, как только одна из двух задач будет выполнена; и вы не хотите, чтобы эта задача выполнялась в другом потоке / процессе, возможно, из-за того, что вы используете асинхронный вызов (что просто означает, что потоки выполняются где-то еще, или вы достаточно низкого уровня, чтобы получить аппаратное прерывание).
Поскольку ваши Worker1 и Worker2 должны совместно использовать один и тот же поток, вам нужен способ сохранить текущее выполнение Main, создать один для одного из работников, а после определенного объема работы, времени или другого даже (Планировщик) переключиться на другого работника и так далее. Это многозадачная система, и для нее есть различные программные реализации в Rust; но с поддержкой HW вы могли бы делать то, что в программном обеспечении вы не могли делать (например, аппаратное обеспечение не позволяло одной Задаче получить доступ к ресурсу из другой), плюс вы можете заставить ЦП заботиться о переключении задач и все ... Ну, вот что такое Thread и Process.
Будущее - это не то, что вы ищете, это более высокий уровень, и вы можете найти какой-нибудь программный планировщик, который их поддерживает.