这篇文章将会讲解在 Python 中使用 多进程模块时在进程之间共享数据和消息传递的概念。
在多处理中,任何新创建的进程都将执行以下操作:
- 独立运行
- 有自己的记忆空间。
可以考虑使用下面的程序来理解此概念:
import multiprocessing
# 具有全局作用域的空列表
result = []
def square_list(mylist):
"""函数对给定列表进行平方运算"""
global result
# 将mylist的方块附加到全局列表结果
for num in mylist:
result.append(num * num)
# 打印全局列表结果
print("Result(in process p1): {}".format(result))
if __name__ == "__main__":
# 输入列表
mylist = [1, 2, 3, 4]
# 创建新进程
p1 = multiprocessing.Process(target=square_list, args=(mylist,))
# 开启进程
p1.start()
# 等待进程完成
p1.join()
# 打印全局结果列表
print("Result(in main program): {}".format(result))
以下是输出结果
Result(in process p1): [1, 4, 9, 16]
Result(in main program): []
在上面的示例中,我们尝试在两个位置打印全局列表结果的内容:
- 在square_list函数中。由于此函数由进程 p1 调用,因此结果列表仅在进程 p1 的内存空间中更改。
- 在主程序中完成过程 p1 后。由于主程序由不同的进程运行,因此其内存空间仍包含空的结果列表。
下图显示了这个概念:
在进程之间共享数据
共享内存
共享内存: 多进程模块提供数组和值对象以在进程之间共享数据。
- 数组: 从共享内存中分配的 ctypes 数组。
- 值: 从共享内存中分配的 ctypes 对象。
下面给出的是一个简单的示例,显示了使用 Array 和 Value 在进程之间共享数据。
import multiprocessing
def square_list(mylist, result, square_sum):
"""函数对给定列表进行平方运算"""
# 将mylist的方块附加到结果数组
for idx, num in enumerate(mylist):
result[idx] = num * num
# 平方和值
square_sum.value = sum(result)
# 打印结果数组
print("Result(in process p1): {}".format(result[:]))
# 打印square_sum值