"Дочерние процессы порождены через многопроцессорные общие объекты, созданные ранее в программе?"
Нет (python до 3.8) и Да в 3.8 ( https://docs.python.org/3/library/multiprocessing.shared_memory.html#module-multiprocessing.shared_memory )
Процессы имеют независимое пространство памяти.
Решение 1
Сделайте это, чтобы наилучшим образом использовать большую структуру с большим количеством рабочих.
Запишите каждого рабочего как «фильтр» - считывает промежуточные результаты из стандартного ввода, выполняет работу, записывает промежуточные результаты в стандартный вывод.
Подключите всех воркеров в конвейер:
process1 <source | process2 | process3 | ... | processn >result
Каждый процесс читает, работает и пишет.
Это замечательно эффективно, поскольку все процессы выполняются одновременно. Записи и чтения проходят напрямую через общие буферы между процессами.
Решение 2
В некоторых случаях у вас более сложная структура - часто «разветвленная» структура. В этом случае у вас есть родитель с несколькими детьми.
Родитель открывает исходные данные. Родитель разветвляет несколько детей.
Родитель читает исходный код, передает части источника каждому параллельно запущенному дочернему элементу.
Когда родитель дойдет до конца, закройте трубу. Ребенок получает конец файла и заканчивает нормально.
Дочерние части приятно писать, потому что каждый ребенок просто читает sys.stdin
.
У родителя есть немного причудливой работы по созданию всех потомков и правильному удержанию труб, но это не так уж плохо.
Фан-ин - это противоположная структура. Ряду независимо выполняющихся процессов необходимо чередовать свои входные данные в общий процесс. Коллектор не так просто написать, так как он должен читать из множества источников.
Чтение из многих именованных каналов часто выполняется с помощью select
модуля, чтобы увидеть, какие каналы имеют ожидающий ввод.
Решение 3
Общий поиск - это определение базы данных.
Решение 3А - загрузить базу данных. Позвольте рабочим обработать данные в базе данных.
Решение 3B - создайте очень простой сервер, используя werkzeug (или аналогичный), чтобы предоставить приложениям WSGI, которые отвечают на HTTP GET, чтобы рабочие могли запрашивать сервер.
Решение 4
Объект общей файловой системы. ОС Unix предлагает объекты разделяемой памяти. Это просто файлы, которые отображаются в памяти, так что ввод-вывод подкачки выполняется вместо операций чтения с буферизацией по соглашению.
Вы можете сделать это из контекста Python несколькими способами.
Напишите программу запуска, которая (1) разбивает исходный гигантский объект на более мелкие объекты и (2) запускает рабочие процессы, каждый с меньшим объектом. Меньшие объекты могут быть обработаны объектами Python, чтобы сэкономить немного времени на чтение файла.
Напишите программу запуска, которая (1) считывает ваш исходный гигантский объект и записывает файл со структурой страниц и байтовым кодом, используя seek
операции, чтобы гарантировать, что отдельные разделы легко найти с помощью простых поисков. Это то, что делает ядро базы данных - разбивает данные на страницы, упрощает поиск каждой страницы с помощью файла seek
.
Создавать воркеры с доступом к этому большому файлу со структурой страниц. Каждый рабочий может искать нужные части и выполнять там свою работу.
marshal.load
родительский и для каждого дочернего (каждый процесс импортирует модуль).