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 模块提供的 Value、Array、Manager 方法。
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.14array
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]交换
进程间交换数据可以使用 Queue 和 Pipe。
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 用的相对较多