multiprocessing.Manager()
для создания общих объектов, таких как списки, словари и очереди, которые могут безопасно использоваться несколькими процессами. Создайте менеджер, затем создайте общий объект через менеджер (например, manager.list()
). Передайте этот общий объект процессам, и они смогут читать и изменять его. Менеджер обеспечивает синхронизацию, чтобы предотвратить конфликты при одновременном доступе.
Модуль multiprocessing.Manager()
предоставляет способ создания объектов Python, которые могут быть безопасно использованы совместно несколькими процессами. Он служит для организации разделяемой памяти между процессами, поскольку процессы обычно не могут напрямую обращаться к памяти друг друга. Manager()
создает серверный процесс, который управляет разделяемыми объектами, а другие процессы взаимодействуют с этим сервером через прокси-объекты. Это позволяет безопасно обмениваться данными без риска гонок данных или повреждения памяти.
Вот основные шаги и пример использования:
multiprocessing
.
multiprocessing.Manager()
.
Manager
для создания разделяемых объектов, таких как list
, dict
, Value
, Array
, и т.д. Эти объекты будут храниться в серверном процессе Manager.
Manager
. Хотя Python имеет сборщик мусора, рекомендуется закрыть менеджер явно с помощью manager.shutdown()
, чтобы освободить ресурсы. В старых версиях Python закрытие менеджера было более важным, чем в новых, где процессы-сироты обрабатываются лучше.
Пример кода:
import multiprocessing
def worker(shared_list, shared_dict, process_id):
"""Функция, выполняемая каждым процессом."""
# Добавляем данные в разделяемый список
shared_list.append(process_id)
# Обновляем разделяемый словарь
shared_dict[process_id] = process_id * 2
print(f"Process {process_id}: List = {shared_list}, Dict = {shared_dict}")
if __name__ == '__main__':
# Создаем Manager
manager = multiprocessing.Manager()
# Создаем разделяемый список и словарь
shared_list = manager.list()
shared_dict = manager.dict()
# Создаем процессы
processes = []
for i in range(3):
process = multiprocessing.Process(target=worker, args=(shared_list, shared_dict, i))
processes.append(process)
process.start()
# Ждем завершения всех процессов
for process in processes:
process.join()
# Выводим результаты (опционально, т.к. процессы уже вывели)
print(f"Main process: Final List = {shared_list}, Final Dict = {shared_dict}")
# Закрываем Manager (важно для освобождения ресурсов)
manager.shutdown()
Важно:
Manager
может быть медленнее, чем использование multiprocessing.Queue
или multiprocessing.Value
/multiprocessing.Array
для простых типов данных, поскольку каждый доступ к разделяемым данным требует межпроцессного взаимодействия.
Queue
, Manager
может быть более подходящим решением.
Manager
, чтобы избежать гонок данных. Manager
предоставляет примитивы синхронизации, такие как Lock
и Semaphore
, которые можно использовать для защиты критических секций кода.
multiprocessing.Queue
, поскольку это обычно быстрее.