Указание second относится к вашему случаю использования.
Первое напоминает вам, что это не многопоточность, когда вы управляете общими структурами данных с помощью блокировок (или атомарных операций).).Если вы используете Manager.dict()
(что на самом деле SyncManager.dict
) для всего, каждое чтение и запись должны иметь доступ к процессу менеджера, и вам также нужна синхронизация, типичная для многопоточных программ (которая сама по себе может стоить дороже из-за перекрестного взаимодействия).-process).
Во втором руководстве предлагается наследовать общие, доступные только для чтения объекты через fork
;в случае forkserver это означает, что вы должны создавать такие объекты перед вызовом set_start_method
, поскольку все рабочие являются дочерними элементами процесса, созданного в то время.
Отчеты оудобство использования такого совместного использования смешано в лучшем случае , но если вы можете использовать небольшое число любого из C-подобных массивов (например, numpy
или стандартный array
модуль)), вы должны увидеть хорошую производительность (потому что большинство страниц никогда не будут написаны для подсчета ссылок).Обратите внимание, что вам не нужно multiprocessing.Array
здесь (хотя это может работать нормально), поскольку вам не нужно записи в одном параллельном процессе, чтобы быть видимым в другом.