Я читал о параллелизме и общей памяти в стиле SysV и POSIX в целом, а также о пакете многопроцессорной обработки Python в частности. Теперь у меня есть несколько вопросов, по которым мой Google-фу пока ни к чему не привел:
Q1 Насколько я понял из этой проблемы в системе отслеживания ошибок Python, недавно представленный multiprocessing.shared_memory.SharedMemory использует именованную разделяемую память POSIX. Однако когда дело доходит до таких типов, как RawArray и RawValue, определенных в multiprocessing.sharedctypes, документация Python оставляет желать лучшего. Как они реализованы внутри?
Q2 Является ли единственное практическое различие между, скажем, RawArray('B') и экземпляром multiprocessing.shared_memory.SharedMemory в том, что последний имеет имя и также доступен из несвязанных (возможно, не Python) процессов? Сопоставима ли их производительность?
Q3 Как именно в Python реализованы многопроцессорные блокировки? Разве им также не нужно использовать какую-то общую память? В документации говорится:
Примечание
Некоторые из функций этого пакета требуют функционирующей реализации общего
семафора в операционной системе хоста. Без него
модуль multiprocessing.synchronize будет отключен, а попытки
импортировать его приведут к ошибке ImportError. См. bpo-3770 для
дополнительной информации.
(Обратите внимание, что multiprocessing.Lock на самом деле происходит от multiprocessing.synchronize.Lock.) Теперь, согласно связанной проблеме bpo-3770, Lock использует shm_open() из libc, который создает именованный семафор. Похоже ли это на то, как работает SharedMemory?
Обновление: Согласно исходному коду – в частности, эти строки: Ссылка 1, ссылка 2 (спасибо, bnaecker!) – в системах, отличных от Windows, RawArray и RawValue просто реализованы с использованием временного файла, который (по крайней мере, в Linux) размещается в каталоге, не поддерживаемом хранилищем, а именно /dev/shm. Тогда это кажется очень похожим на то, как работает общее хранилище POSIX, то есть SharedMemory. Итак, я думаю, мне следует заменить свой вопрос Q1 следующим: Почему вообще была введена функция Shared_memory, если RawArray настолько похож? В вышеупомянутой проблеме с самого начала упоминаются причины производительности, но я не понимаю, откуда такая разница в производительности (по крайней мере, в Linux)?
Подробнее здесь: https://stackoverflow.com/questions/639 ... ally-how-d