Skip to content

9. 进程间数据共享

进程是资源分配的最小单元,每个进程中都维护自己独立的数据,不共享

python
import multiprocessing


def task(data):
    # 在子进程中添加数据,主进程不变
    data.append(1)
    print("子进程数据:", data)


if __name__ == "__main__":
    data_list = []
    process = multiprocessing.Process(target=task, args=(data_list,))
    process.start()
    process.join()
    print("主进程数据:", data_list)  # 输出结果[]

共享

如果需要进程间共享数据,可以使用 multiprocessing 模块提供的 ValueArrayManager 方法。

value

python
from multiprocessing import Process, Value


def task(n, m1, m2):
    n.value = 888
    m1.value = "a".encode("utf-8")
    m2.value = 3.14


if __name__ == "__main__":
    n = Value("i", 0)  # 整型
    m1 = Value("c", b"0")  # 字符型
    m2 = Value("d", 0.0)  # 浮点型

    p = Process(target=task, args=(n, m1, m2))
    p.start()
    p.join()

    print(n.value)  # 888
    print(m1.value)  # b'a'
    print(m2.value)  # 3.14

array

python
from multiprocessing import Array, Process


def task(arr):
    arr[0] = 666


if __name__ == "__main__":
    data_array = Array("i", range(10))  # 整型数组

    p = Process(target=task, args=(data_array,))
    p.start()
    p.join()
    print(data_array[:])  # 输出结果[666, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Manager

python
from multiprocessing import Manager, Process


def task(d, l):
    d["x"] = "hello"
    l.append(42)


if __name__ == "__main__":
    with Manager() as manager:
        data_dict = manager.dict()
        data_list = manager.list()
        process = Process(target=task, args=(data_dict, data_list))
        process.start()
        process.join()
        print("字典内容:", data_dict)  # 输出结果{'x': 'hello'}
        print("列表内容:", data_list)  # 输出结果[42]

交换

进程间交换数据可以使用 QueuePipe

Queue

python
import multiprocessing


def task(q):
    q.put("数据从子进程来")


if __name__ == "__main__":
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=task, args=(q,))
    p.start()
    p.join()
    print(q.get())  # 主进程取出的数据:数据从子进程来

Pipe

python
import multiprocessing
import time


def task(conn):
    time.sleep(1)
    conn.send("数据从子进程来")
    data = conn.recv()  # 主进程发送的数据
    print("子进程收到数据:", data)
    time.sleep(1)


if __name__ == "__main__":
    parent_conn, child_conn = multiprocessing.Pipe()
    p = multiprocessing.Process(target=task, args=(child_conn,))
    p.start()

    info = parent_conn.recv()  # 接收子进程发送的数据
    print("主进程收到数据:", info)
    parent_conn.send("数据从主进程来")  # 发送数据给子进程

Queue 和 Manager 用的相对较多

构建时间:11/21/2025, 1:28:39 PM | 本博客内容均为自己学习,如内容涉及侵权,请联系邮箱:pangzl0215@163.com