#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 в настоящее время не поддерживает передачу ровно одного сообщения на данный момент.