Программа, которая создает несколько процессов, работающих в очереди с возможностью присоединения Q
, и может в конечном итоге управлять глобальным словарем D
для сохранения результатов. (поэтому каждый дочерний процесс может использовать D
для хранения своего результата, а также видеть, какие результаты производят другие дочерние процессы)
Если я распечатаю словарь D в дочернем процессе, я увижу внесенные в него изменения (то есть в D). Но после того, как основной процесс присоединяется к Q, если я печатаю D, это пустой dict!
Я понимаю, что это проблема синхронизации / блокировки. Может кто подскажет, что здесь происходит, и как мне синхронизировать доступ к D?
python
multiprocessing
допинг
источник
источник
Ответы:
Общий ответ предполагает использование
Manager
объекта. Адаптировано из документации:Вывод:
источник
multiprocessing.Manager()
возвращает экземплярSyncManager
, название которого предполагает то же самое!Manager
но все равно не повезло. Не могли бы вы взглянуть на мой вопрос здесь и посмотреть, можете ли вы предложить решение? Я все еще могу получать разные случайные числа, если я делаю этоnp.random.seed(None)
каждый раз, когда генерирую случайное число, но это не позволяет мне использовать случайное состояние родительского процесса, чего я не хочу. Любая помощь приветствуется.многопроцессорность не похожа на многопоточность. Каждый дочерний процесс получит копию памяти основного процесса. Обычно состояние передается через связь (каналы / сокеты), сигналы или разделяемую память.
Многопроцессорность делает некоторые абстракции доступными для вашего варианта использования - общее состояние, которое обрабатывается как локальное с помощью прокси-серверов или общей памяти: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes
Соответствующие разделы:
источник
Я хотел бы поделиться своей собственной работой, которая работает быстрее, чем dict менеджера, проще и стабильнее, чем библиотека pyshmht, которая использует тонны памяти и не работает для Mac OS. Хотя мой dict работает только для простых строк и в настоящее время неизменен. Я использую реализацию линейного зондирования и храню пары ключей и значений в отдельном блоке памяти после таблицы.
На моем ноутбуке результаты производительности следующие:
простой пример использования:
источник
Помимо @senderle здесь, некоторым также может быть интересно, как использовать функциональность
multiprocessing.Pool
.Приятно то, что
.Pool()
вmanager
экземпляре есть метод , имитирующий все знакомые API верхнего уровняmultiprocessing
.Вывод:
Это немного другой пример, где каждый процесс просто регистрирует свой идентификатор процесса в глобальном
DictProxy
объектеd
.источник
Возможно, вы можете попробовать pyshmht , расширение хэш-таблицы на основе памяти для Python.
Уведомление
Это не полностью протестировано, просто для справки.
В настоящее время в нем отсутствуют механизмы lock / sem для многопроцессорной обработки.
источник