Таймаут прошёл, вычисление осталось: как подтвердить отмену задачи в Ray
ray.get ограничивает ожидание, а ray.cancel запрашивает отмену. Учебный пример помогает различить готовый результат, подтверждённую отмену и неизвестный исход; у актёров действуют отдельные правила.
Таймаут в клиенте может скрыть продолжающееся вычисление. Если конвейер ИИ на Ray перестал ждать ответ, это ещё не означает, что отправленная задача остановлена. Чтобы освободить работу осмысленно, нужно разделить предел ожидания, запрос отмены и подтверждение результата.
Сначала определите, что именно остановили
В справке ray.get параметр timeout ограничивает ожидание объекта. Когда время истекает, вызывающий код получает GetTimeoutError. Для отмены есть отдельный ray.cancel. Ни скрытая кнопка загрузки, ни закрытое ожидание в вашем приложении сами по себе не заменяют этот вызов.
Памятка опирается на документацию Ray 2.59.0. У обычной удалённой функции ещё не запущенную задачу отменяют до исполнения. Для уже работающей force=False вызывает KeyboardInterrupt в Python; force=True завершает рабочий процесс. Если результат уже готов, отменять нечего. Поэтому гонку между завершением и отменой нужно считать штатным исходом.
Проверьте три исхода на учебной задаче
Ниже пример для отдельного локального окружения с установленным Ray. Он задаёт долгое ожидание внутри обычной удалённой функции, сначала ждёт секунду, затем запрашивает мягкую отмену и ещё пять секунд ждёт подтверждения. Это учебный сценарий по контракту API, а не наш замер скорости остановки.
import time
import ray
from ray.exceptions import GetTimeoutError, TaskCancelledError
ray.init()
@ray.remote
def slow():
time.sleep(30)
return "finished"
ref = slow.remote()
try:
print(ray.get(ref, timeout=1))
except GetTimeoutError:
ray.cancel(ref, force=False)
try:
print(ray.get(ref, timeout=5))
except TaskCancelledError:
print("cancellation confirmed")
except GetTimeoutError:
print("cancellation not confirmed yet")
Читайте результат буквально. cancellation confirmed означает полученный TaskCancelledError. finished означает, что задача успела вернуть результат. Сообщение о неподтверждённой отмене говорит лишь об истечении второго ожидания: нельзя записывать в журнал успех остановки. Другие ошибки пример намеренно не маскирует под отмену — их нужно разбирать отдельно.
У актёра другой договор
Для обычного или потокового актёра Ray выставляет флаг отмены. Код метода должен периодически проверять ray.get_runtime_context().is_canceled() и корректно завершать работу. У асинхронного актёра отменяется задача asyncio; этот метод проверки флага для него не поддерживается. Одну обработку отмены нельзя механически переносить между этими моделями исполнения.
Для метода актёра разрешён только force=False; принудительный вариант вызовет ValueError. Уничтожение самого актёра через ray.kill — отдельное решение с другими последствиями, а не усиленный вариант отмены одного вызова. По умолчанию recursive=True также запрашивает отмену дочерних задач; отменённые задачи автоматически не повторяются.
Перед внедрением проверьте ещё и прикладной эффект: остановленный расчёт не должен отмечаться завершённым, а уже выполненная внешняя запись требует собственной логики восстановления. API отмены вычисления не даёт основания обещать откат таких действий. Практический критерий для кнопки «Стоп» — подтверждённый исход задачи и честный статус при неопределённости. Если есть только таймаут, показывайте прекращение ожидания, пока остановка не подтверждена.
Комментарии
Войдите, чтобы оставить комментарий
Пока нет комментариев. Начните обсуждение.