«Дочерние процессы порождаются через объекты общего доступа, созданные ранее в программе?»
Нет.
Процессы имеют независимое пространство памяти.
Раствор 1
Чтобы лучше использовать большую структуру с большим количеством рабочих, сделайте это.
Напишите каждого работника как «фильтр» & ndash; читает промежуточные результаты из стандартного ввода, работает, записывает промежуточные результаты в стандартный вывод.
Соедините всех рабочих как трубопровод:
process1 <source | process2 | process3 | ... | processn >result
Каждый процесс читает, работает и пишет.
Это очень эффективно, поскольку все процессы выполняются одновременно. Операции записи и чтения проходят напрямую через общие буферы между процессами.
Решение 2
В некоторых случаях у вас более сложная структура & ndash; часто "разветвленная" структура. В этом случае у вас есть родитель с несколькими детьми.
Родитель открывает исходные данные. Родитель разветвляет несколько детей.
Родитель читает источник, передает части исходного кода каждому параллельно работающему дочернему элементу.
Когда родитель достигнет конца, закройте трубу. Ребенок получает конец файла и заканчивается нормально.
Дочерние части приятно писать, потому что каждый ребенок просто читает sys.stdin
.
У родителя немного причудливой работы, чтобы порождать всех детей и правильно удерживать трубы, но это не так уж плохо.
Разветвление - противоположная структура. Ряд независимо запущенных процессов должен чередовать свои входные данные в общий процесс. Коллектор не так прост в написании, так как он должен читать из многих источников.
Чтение из многих именованных каналов часто выполняется с помощью модуля select
, чтобы увидеть, какие каналы имеют ожидающий ввод.
Раствор 3
Общий поиск - это определение базы данных.
Раствор 3А - загрузить базу данных. Пусть рабочие обрабатывают данные в базе данных.
Решение 3B - создайте очень простой сервер, используя werkzeug (или аналогичный) для предоставления приложений WSGI, которые отвечают на HTTP GET, чтобы работники могли запрашивать сервер.
Раствор 4
Объект общей файловой системы. Unix OS предлагает объекты с общей памятью. Это просто файлы, которые сопоставлены с памятью, так что переключение операций ввода-вывода выполняется вместо обычного буферизованного чтения.
Вы можете сделать это из контекста Python несколькими способами
Напишите программу запуска, которая (1) разбивает ваш оригинальный гигантский объект на более мелкие объекты и (2) запускает рабочих, каждый из которых имеет меньший объект. Меньшие объекты могут быть выбраны из объектов Python, чтобы сэкономить немного времени на чтение файла.
Напишите программу запуска, которая (1) читает ваш исходный гигантский объект и записывает файл со структурой страницы, байтовым кодом, используя операции seek
, чтобы гарантировать, что отдельные разделы легко найти с помощью простого поиска. Это то, что делает движок базы данных & ndash; разбить данные на страницы, облегчить поиск каждой страницы с помощью seek
.
Рабочие спавна имеют доступ к этому большому файлу со структурой страниц. Каждый работник может искать соответствующие части и выполнять свою работу там.