Стандартный способ дождаться завершения всех задач перед выходом

Мне было интересно - есть ли простой способ дождаться завершения выполнения всех задач перед выходом, не отслеживая все ObjectIDs (и get()ing их)? Вариант использования - когда я запускаю @remotes для сохранения вывода, например, когда нет необходимости возвращать результат. Это просто дополнительный материал, который нужно отслеживать, если мне придется хранить эти фьючерсы.


ray
person Zach Barry    schedule 07.02.2019    source источник


Ответы (1)


В настоящее время нет стандартного способа блокировки, пока все задачи не будут выполнены.

Есть несколько обходных путей, которые можно использовать.

  1. Отслеживайте все идентификаторы объектов в списке object_ids, а затем вызывайте ray.get(object_ids) или ray.wait(object_ids, num_returns=len(object_ids)).

  2. Цикл, пока используются некоторые ресурсы.

    import time
    
    while (ray.global_state.cluster_resources() !=
           ray.global_state.available_resources()):
        time.sleep(1)
    

    Приведенный выше код будет зацикливаться до тех пор, пока не обнаружит, что в настоящее время не выполняются никакие задачи. Однако это не надежный подход. Возможно, что может быть момент времени, когда никакие задачи не выполняются, но планировщик задача вот-вот запустится.

person Robert Nishihara    schedule 08.02.2019
comment
Спасибо. Как вы думаете, такая функция может быть реализована в будущем? Основываясь на вашем 2) фрагменте, я предполагаю, что вы используете Ray как способ запуска направленных ациклических графов, если ваш код написан последовательно как: init(); thingthatsubmitsremotes_1(); thingthatsubmitsremotes_2(); ...; sleepforabit(); entersleeploop(), поскольку Ray так быстро планирует задачи, если начальный время сна — это миллисекундная шкала планирования задач, этот фрагмент редко закрывается, потому что задача еще не запланирована? - person Zach Barry; 08.02.2019
comment
Я думаю, что семантику нужно определить немного точнее. Например, что произойдет, если задача уже выполнялась на машине, но затем машина умерла? Что делать, если задача не может быть выполнена, потому что у нее есть потребность в ресурсах, которая не удовлетворяется ни одним из узлов? В Ray на самом деле нет центрального списка всех выполненных задач (есть, но он может быть устаревшим). Учитывая тонкости, я думаю, имеет смысл пока позволить приложению справиться с этим. Тем не менее, я думаю, что для простых случаев, не являющихся крайними, приведенные выше хаки обычно должны работать. - person Robert Nishihara; 12.02.2019