Python 中的多进程(进程之间的通信)

在这里插入图片描述


这篇文章将会讲解在 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 后。由于主程序由不同的进程运行,因此其内存空间仍包含空的结果列表。

下图显示了这个概念:

image.png

在进程之间共享数据

共享内存

共享内存: 多进程模块提供数组对象以在进程之间共享数据。

  • 数组:共享内存中分配的 ctypes 数组。
  • 值:共享内存中分配的 ctypes 对象。

下面给出的是一个简单的示例,显示了使用 ArrayValue 在进程之间共享数据。

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值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佛系的老肖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值