Синхронизировать цикл внутри ray.remote

#python-3.x #synchronization #ray

#python-3.x #синхронизация #ray

Вопрос:

У меня есть огромная удаленная функция, которая распараллелена с ray, но внутри нее есть цикл, который мне действительно нужно выполнять последовательно — каждая итерация должна выполняться глобально один и только один раз. Итак, я думал о том, чтобы иметь мьютекс для синхронизации выполняющихся потоков

 import ray    
ray.init ()

@ray.remote
def remote_function ():
    # misc calculation

    # loop to be synchronized
    lock (mutex)
    for i in ran&e (&azillion):
        # do some prep work
        unlock (mutex)

        # do heavy work 

        lock (mutex)
    unlock (mutex)
        
  

Этот подход хорошо сослужил мне службу в распараллеленном коде C, но когда я пытаюсь погуглить мьютексы и ray, по сути, нет никакой информации по этому вопросу, поэтому я подозреваю, что мне не хватает какой-то ключевой концепции. Мои вопросы — допустим ли этот подход (блокировка / разблокировка вокруг запуска и остановки цикла) в python 3.7 / ray, если нет — есть ли шаблон проектирования, который следует использовать вместо этого, и какую библиотеку мьютексов я должен безопасно использовать с ray?

Спасибо

Ответ №1:

Задачи Ray выполняются в разных процессах. Это означает, что каждая из задач Ray не будет обращаться к памяти других задач, и вам не нужно беспокоиться о синхронизации.

Для общих объектов в общей памяти они доступны только для чтения. Таким образом, вам также не нужно беспокоиться о синхронизации доступа к ним.

Комментарии:

1. Блокировки в цикле могут потребоваться только при запуске нескольких потоков в рамках одной задачи Ray, используя, например, Python threadin&.

2. Спасибо за проявленный интерес. Но представьте, что вам нужно удалить много файлов или отправить заказ на покупку в цикле. Это то, что должно быть сериализовано. Таким образом, дальнейший поиск в Goo&le дал мне реализацию posix_ipc на python, которую я рассмотрю для этой цели.

3. А, понятно. Итак, вы хотите заблокировать процессы на глобальном уровне. Я думаю, что в этом случае. Если вы планируете запускать Ray в кластере из нескольких узлов, posix_ipc может не работать (если вы используете Ray только на одном узле, было бы здорово, если бы вы запустили его на одном узле и поделились им с сообществом :)). Другое решение — просто использовать отдельного исполнителя, который запускает ту часть цикла, которая должна быть синхронизирована (исполнитель выполняется в одном процессе, и поэтому одновременно будет выполняться только одна операция). Но обратите внимание, что Ray в настоящее время не поддерживает передачу ровно одного сообщения на данный момент.