torch.futures
Создано: 12 июня 2025 | Последнее обновление: 12 июня 2025
Этот пакет предоставляет тип Future, инкапсулирующий асинхронное выполнение, а также набор вспомогательных функций для упрощения работы с объектами Future. В настоящее время тип Future используется главным образом в распределённой RPC-инфраструктуре.
-
class torch.futures.Future(*, devices=None) -
Обёртка над
torch._C.Future, инкапсулирующая асинхронное выполнение вызываемого объекта, напримерrpc_async(). Также предоставляет набор API для добавления функций обратного вызова и установки результатов.Предупреждение
Поддержка GPU — это бета-функция, которая может измениться.
-
add_done_callback(callback)[исходный код] -
Добавляет указанную функцию обратного вызова в этот
Future. Она будет выполнена после завершенияFuture. К одномуFutureможно добавить несколько функций обратного вызова, однако порядок их выполнения не гарантируется. Функция обратного вызова должна принимать один аргумент — ссылку на этотFuture. Чтобы получить значение, функция обратного вызова может использовать методvalue(). Обратите внимание: если этотFutureуже завершён, указанная функция обратного вызова будет выполнена сразу в текущем потоке.Рекомендуем использовать метод
then(), поскольку он позволяет синхронизироваться после завершения функции обратного вызова.add_done_callbackможет быть эффективнее, если функция обратного вызова ничего не возвращает. Однако иthen(), иadd_done_callbackиспользуют под капотом один и тот же API регистрации функций обратного вызова.Для тензоров GPU этот метод работает так же, как
then().- Параметры:
-
callback (
Future) – функция обратного вызоваCallable, принимающая один аргумент — ссылку на этотFuture.
Примечание
Обратите внимание: если функция обратного вызова вызывает исключение — из-за того, что исходный future завершается с исключением и вызывает
fut.wait(), либо из-за другого кода в функции обратного вызова, — обработку ошибки необходимо тщательно продумать. Например, если эта функция обратного вызова впоследствии завершает другие future, эти future не будут помечены как завершённые с ошибкой, и пользователь должен самостоятельно обработать их завершение и ожидание.Пример:
>>> def callback(fut): ... print("This will run after the future has finished.") ... print(fut.wait()) >>> fut = torch.futures.Future() >>> fut.add_done_callback(callback) >>> fut.set_result(5) This will run after the future has finished. 5
-
done()[исходный код] -
Возвращает
True, если этотFutureзавершён.Futureсчитается завершённым, если у него есть результат или исключение.Если значение содержит тензоры, расположенные на GPU,
Future.done()вернётTrue, даже если асинхронные ядра, заполняющие эти тензоры, ещё не завершили работу на устройстве, поскольку на этом этапе результат уже можно использовать при условии выполнения необходимых синхронизаций (см.wait()).- Тип возвращаемого значения:
-
set_exception(result)[исходный код] -
Устанавливает исключение для этого
Future, помечая егоFutureкак завершённый с ошибкой и вызывая все зарегистрированные функции обратного вызова. Обратите внимание: при вызове wait()/value() для этогоFutureустановленное здесь исключение будет немедленно выброшено.- Параметры:
-
result (BaseException) – исключение для этого
Future.
Пример:
>>> fut = torch.futures.Future() >>> fut.set_exception(ValueError("foo")) >>> fut.wait() Traceback (most recent call last): ... ValueError: foo
-
set_result(result)[исходный код] -
Устанавливает результат для этого
Future, помечая егоFutureкак завершённый и вызывая все зарегистрированные функции обратного вызова. Обратите внимание:Futureнельзя пометить как завершённый дважды.Если результат содержит тензоры, расположенные на GPU, этот метод можно вызвать, даже если асинхронные ядра, заполняющие эти тензоры, ещё не завершили работу на устройстве, при условии что потоки, в которых были поставлены в очередь эти ядра, являются текущими на момент вызова метода. Проще говоря, этот метод можно безопасно вызвать сразу после запуска этих ядер без дополнительной синхронизации, если потоки не меняются. Метод запишет события во всех соответствующих текущих потоках и использует их для обеспечения правильного планирования работы всех потребителей этого
Future.- Параметры:
-
result (object) – объект результата этого
Future.
Пример:
>>> import threading >>> import time >>> def slow_set_future(fut, value): ... time.sleep(0.5) ... fut.set_result(value) >>> fut = torch.futures.Future() >>> t = threading.Thread( ... target=slow_set_future, ... args=(fut, torch.ones(2) * 3) ... ) >>> t.start() >>> print(fut.wait()) tensor([3., 3.]) >>> t.join()
-
then(callback)[исходный код] -
Добавляет указанную функцию обратного вызова в этот
Future. Она будет выполнена после завершенияFuture. К одномуFutureможно добавить несколько функций обратного вызова, однако порядок их выполнения не гарантируется (чтобы задать определённый порядок, используйте цепочку вызовов:fut.then(cb1).then(cb2)). Функция обратного вызова должна принимать один аргумент — ссылку на этотFuture. Чтобы получить значение, функция обратного вызова может использовать методvalue(). Обратите внимание: если этотFutureуже завершён, указанная функция обратного вызова будет немедленно выполнена в текущем потоке.Если значение
Futureсодержит тензоры, расположенные на GPU, функция обратного вызова может быть вызвана до того, как асинхронные ядра, заполняющие эти тензоры, завершат выполнение на устройстве. Однако функция обратного вызова будет вызвана при установленных в качестве текущих выделенных потоках (полученных из глобального пула), синхронизированных с этими ядрами. Поэтому любые операции, выполняемые функцией обратного вызова над этими тензорами, будут запланированы на устройстве после завершения ядер. Иными словами, функция обратного вызова может безопасно работать с результатом без дополнительной синхронизации, если она не переключает потоки. Это аналогично неблокирующему поведению методаwait().Аналогично, если функция обратного вызова возвращает значение, содержащее тензоры, расположенные на GPU, это допустимо, даже если ядра, создающие эти тензоры, всё ещё выполняются на устройстве, при условии что функция обратного вызова не меняла потоки во время выполнения. Если требуется сменить потоки, необходимо повторно синхронизировать их с исходными потоками, то есть с теми, которые были текущими при вызове функции обратного вызова.
- Параметры:
-
callback (
Callable) – функция обратного вызоваCallable, принимающая этотFutureв качестве единственного аргумента. - Возвращает:
-
Новый объект
Future, содержащий возвращаемое значениеcallbackи помечаемый как завершённый после завершения указаннойcallback. - Тип возвращаемого значения:
-
Future[S]
Примечание
Обратите внимание: если функция обратного вызова вызывает исключение — из-за того, что исходный future завершается с исключением и вызывает
fut.wait(), либо из-за другого кода в функции обратного вызова, — future, возвращённый вызовомthen, будет соответствующим образом помечен обнаруженной ошибкой. Однако если эта функция обратного вызова впоследствии завершает другие future, эти future не будут помечены как завершённые с ошибкой, и пользователь должен самостоятельно обработать их завершение и ожидание.Пример:
>>> def callback(fut): ... print(f"RPC return value is {fut.wait()}.") >>> fut = torch.futures.Future() >>> # The inserted callback will print the return value when >>> # receiving the response from "worker1" >>> cb_fut = fut.then(callback) >>> chain_cb_fut = cb_fut.then( ... lambda x : print(f"Chained cb done. {x.wait()}") ... ) >>> fut.set_result(5) RPC return value is 5. Chained cb done. None
-
value()[исходный код] -
Получает значение уже завершённого future.
Этот метод следует вызывать только после завершения вызова
wait()или внутри функции обратного вызова, переданной вthen(). В остальных случаях этотFutureможет ещё не содержать значения, и вызовvalue()может завершиться ошибкой.Если значение содержит тензоры, расположенные на GPU, этот метод не выполняет дополнительную синхронизацию. Её необходимо выполнить заранее отдельно с помощью вызова
wait()(за исключением функций обратного вызова, где синхронизация уже обеспечивается методомthen()).- Возвращает:
-
Значение, хранящееся в этом
Future. Если функция (функция обратного вызова или RPC), создавшая значение, вызвала ошибку, этот методvalue()также вызовет ошибку. - Тип возвращаемого значения:
-
T
-
wait()[исходный код] -
Блокирует выполнение до готовности значения этого
Future.Если значение содержит тензоры, расположенные на GPU, выполняется дополнительная синхронизация с ядрами, выполняющимися на устройстве и, возможно, асинхронно заполняющими эти тензоры. Такая синхронизация не блокирует выполнение:
wait()добавит необходимые инструкции в текущие потоки, чтобы обеспечить правильное планирование последующих операций в этих потоках после асинхронных ядер, но после этогоwait()вернёт управление, даже если эти ядра ещё выполняются. При доступе к значениям и их использовании дополнительная синхронизация не требуется, если потоки не меняются.- Возвращает:
-
Значение, хранящееся в этом
Future. Если функция (функция обратного вызова или RPC), создавшая значение, вызвала ошибку, этот методwaitтакже вызовет ошибку. - Тип возвращаемого значения:
-
T
-
-
torch.futures.collect_all(futures)[исходный код] -
Собирает переданные объекты
Futureв один общий объектFuture, который завершается после завершения всех вложенных future.- Параметры:
- Возвращает:
-
Объект
Future, содержащий список переданных объектов Future. - Тип возвращаемого значения:
- Пример::
-
>>> fut0 = torch.futures.Future() >>> fut1 = torch.futures.Future() >>> fut = torch.futures.collect_all([fut0, fut1]) >>> fut0.set_result(0) >>> fut1.set_result(1) >>> fut_list = fut.wait() >>> print(f"fut0 result = {fut_list[0].wait()}") fut0 result = 0 >>> print(f"fut1 result = {fut_list[1].wait()}") fut1 result = 1
-
torch.futures.wait_all(futures)[исходный код] -
Ожидает завершения всех переданных future и возвращает список завершённых значений. Если в одном из future возникает ошибка, метод немедленно завершается и сообщает об ошибке, не дожидаясь завершения остальных future.
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/futures.html