Модуль multiprocessing
предоставляет именно то, что вам нужно: общий массив с дополнительной блокировкой, а именно класс multiprocessing.Array
. Передайте lock=False
конструктору, чтобы отключить блокировку.
Редактировать (с учетом вашего обновления): На самом деле все значительно сложнее, чем я ожидал. Данные всех элементов в вашем списке должны быть созданы в общей памяти. Поместите ли вы сам список (то есть указатели на фактические данные) в общую память, не имеет большого значения, потому что он должен быть небольшим по сравнению с данными всех файлов. Чтобы сохранить данные файла в общей памяти, используйте
shared_data = multiprocessing.sharedctypes.RawArray("c", data)
где data
- данные, которые вы читаете из файла. Чтобы использовать это как массив NumPy в одном из процессов, используйте
numpy.frombuffer(shared_data, dtype="c")
, который создаст представление массива NumPy для общих данных. Аналогично, чтобы поместить путь в общую память, используйте
shared_path = multiprocessing.sharedctypes.RawArray("c", path)
где путь - обычная строка Python. В ваших процессах вы можете получить к нему доступ в виде строки Python, используя shared_path.raw
. Теперь добавьте (shared_data, shared_path)
в свой список. Список будет скопирован в другие процессы, но фактические данные не будут.
Сначала я хотел использовать multiprocessing.Array
для фактического списка. Это было бы вполне возможно и гарантировало бы, что сам список (то есть указатели на данные) находится в разделяемой памяти. Теперь я думаю, что это не так важно, пока фактические данные передаются.