MST

星途 面试题库

面试题:Python中multiprocessing模块进程间如何共享数据

在利用Python的multiprocessing模块实现多进程时,进程之间默认是相互隔离的。请描述至少两种在进程间共享数据的方式,并举例说明如何使用。
48.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. 使用 multiprocessing.Valuemultiprocessing.Array

这两个类用于在进程间共享简单的数据类型。multiprocessing.Value 用于共享单个值,multiprocessing.Array 用于共享数组。

import multiprocessing


def increment_value(shared_value):
    with shared_value.get_lock():
        shared_value.value += 1


def increment_array(shared_array):
    for i in range(len(shared_array)):
        with shared_array.get_lock():
            shared_array[i] += 1


if __name__ == '__main__':
    shared_value = multiprocessing.Value('i', 0)
    shared_array = multiprocessing.Array('i', [0] * 5)

    processes = []
    for _ in range(5):
        p1 = multiprocessing.Process(target=increment_value, args=(shared_value,))
        p2 = multiprocessing.Process(target=increment_array, args=(shared_array,))
        processes.extend([p1, p2])
        p1.start()
        p2.start()

    for p in processes:
        p.join()

    print(f"Shared value: {shared_value.value}")
    print(f"Shared array: {list(shared_array)}")

2. 使用 multiprocessing.Manager

multiprocessing.Manager 提供了多种可在进程间共享的数据类型,如 dictlist 等。

import multiprocessing


def update_dict(shared_dict):
    shared_dict['count'] = shared_dict.get('count', 0) + 1


def update_list(shared_list):
    shared_list.append(len(shared_list))


if __name__ == '__main__':
    manager = multiprocessing.Manager()
    shared_dict = manager.dict()
    shared_list = manager.list()

    processes = []
    for _ in range(5):
        p1 = multiprocessing.Process(target=update_dict, args=(shared_dict,))
        p2 = multiprocessing.Process(target=update_list, args=(shared_list,))
        processes.extend([p1, p2])
        p1.start()
        p2.start()

    for p in processes:
        p.join()

    print(f"Shared dict: {dict(shared_dict)}")
    print(f"Shared list: {list(shared_list)}")