0

Query: Есть ли способ в Python сказать:Как настроить альтернативу `/ DEV/ГИМ /` или `_multiprocessing.SemLock` в Python

  • Не используйте /dev/shm для общего а также использовать другое временное местоположение, например /tmp. ИЛИ

  • multiprocessing.SemLock Вместо использования threading.Lock для синхронизации (если это возможно и не нелогично).

фон:

Я бегу простой multiprocessing.Pool пример на с ESX (гипервизор), который работает в OSError : Function not implemented error.

Другие упоминания об этой проблеме (here и here) на StackOverflow указывают, что это происходит, когда /dev/shm не установлен. В связи с этим _multiprocessing.SemLock не может создать блокировку синхронизации.

Это на самом деле случай для меня, поскольку ls -lrt /dev/shm не подходит для меня. Однако я не могу попробовать решения, рекомендованные на ссылки выше, как

  • mount, как команда монтирования не реализована на платформе (ESX/VMkernel) Я работает.

  • VM не является постоянным, и /etc/fstab смывается при выключении.

Так что я ищу способы либо использовать threading.Lock() для синхронизации или попросить Python, чтобы не использовать /dev/shm/ для синхронизации.

+0

Я понимаю, как 80% вашего вопроса. Там, где я спотыкаюсь, вы пытаетесь использовать потоки ('threading.lock') и' multiprocessing'. Вы все еще не знаете, какой из них выбрать? Или вы перепутали эти два? Поскольку вы не можете использовать 'threading.lock', используя процессы – hansaplast

+0

Обнаружили ли вы какое-нибудь обходное решение?У меня такая же проблема на AWS Lambda, где/dev/shm не монтируется в контейнере, в котором работает лямбда. – Atifm

ответ

1

Если вы попытаетесь использовать объект threading.Lock в двух процессах multiprocessing, два объекта Lock не будут связаны. threading.Lock полагается на то, что 2 Thread будет работать на одном ядре и делиться файловыми дескрипторами и GIL. Это не относится к 2 Process.

Модуль _multiprocessing.semaphore полагается на ОС pthread.sem_open для создания объекта SemLock. Это означает, что главный вопрос: есть ли какие-то семафоры ОС на ESX? Если есть, вы можете реализовать свои собственные объекты SemLock, используя ctypes и вдохновение от loky.backend.semlock, что позволит вам получить доступ к внутренним примитивам pthread.

Обратите внимание, что это может потребовать много работы, чтобы убедиться, что SemLock правильно используется с модулем multiprocessing. Решением может быть использование модифицированной версии loky, которая использует этот SemLock, если вам удастся реализовать его на ESX.