python多进程共享Array

文章介绍了Python的multiprocessing库中的Array类,用于在多进程中创建共享数组,实现数据同步。通过示例展示了如何创建一维和三维共享数组,并在不同进程中进行读取和修改操作。警告提到了非numpy数组在使用numpy.random.shuffle时可能存在不正确行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

可以使用multiprocessing库中的Array来实现多进程共享Array。multiprocessing库是一个用于实现多进程编程的库,提供了与多进程有关的同步,通信和进程管理等功能。在这个库中,有一个Array类,用于创建一个多进程共享的数组。这样,每个进程都可以访问这个共享的数组,从而实现数据共享和同步。

基础知识介绍

  1. multiprocessing.Array

multiprocessing.Array是Python的多进程库中的一个数组对象,它用于在多个进程之间共享数组数据。Array类型是在共享内存中实现的,每个进程可以操作该数组的值。这是在多个进程间同步数据的一种常用方法,因为它们在同一内存中运行。

使用multiprocessing.Array,你可以创建一个共享的数组,并在多个进程中读取和修改数组的值。通过使用该模块,您可以避免将数组通过管道或套接字从一个进程传递到另一个进程的问题。

  1. multiprocessing.Array 函数接受以下参数:
  • typecode:字符串,表示数组元素的数据类型。可用的数据类型包括 'b'(布尔),'i'(整数),'f'(浮点数),'c'(单字符),'u'(Unicode字符)等。

  • size:整数,表示数组的大小。

  • lock:布尔值,指示是否应该为数组元素创建锁(锁定)。

以上参数中,前两个是必需的,而后一个是可选的。

python多进程共享一维Array

举个例子,你可以使用multiprocessing库中的Array创建一个整型数组,并在两个进程中分别执行读取和写入操作,从而实现多进程共享Array。

代码

from multiprocessing import Process, Array
import time


def print_array(arr, n):
    while True:
        for i in range(n):
            print("Process {}: {}".format(i, arr[i]))
        time.sleep(1)


test_count = 1


def set_array(arr, n):
    global test_count
    while True:
        for i in range(n):
            arr[i] = i + test_count
        time.sleep(1)
        test_count += 1
        print(test_count)


if __name__ == "__main__":
    arr = Array('i', [0, 0, 0, 0, 0, 0, 0, 0, 0])
    n = len(arr)
    process1 = Process(target=print_array, args=(arr, n))
    process2 = Process(target=set_array, args=(arr, n))

    process1.start()
    process2.start()

    process1.join()
    process2.join()

这段代码创建了两个进程:一个打印数组的进程(print_array)和一个设置数组的进程(set_array)。这两个进程同时运行,互不影响。

print_array 进程通过一个循环打印数组中的每一个元素,并在每次循环之后等待 1 秒。

set_array 进程通过一个循环设置数组中的每一个元素,并在每次循环之后等待 1 秒。它设置的数组的每一个元素的值都是经过累加的。

通过 Array 对象,两个进程共享同一个数组。需要注意的是,在 Python 中多进程之间共享数据时需要特殊处理,以保证同步与数据完整性。这里使用的 multiprocessing.Array 可以方便地共享数组。

程序的主流程是创建两个进程,启动它们并等待它们结束。当两个进程都结束后,程序结束。

运行结果

Process 0: 0
Process 1: 0
Process 2: 0
Process 3: 0
Process 4: 0
Process 5: 0
Process 6: 0
Process 7: 0
Process 8: 0
2
Process 0: 1
Process 1: 3
Process 2: 4
Process 3: 5
Process 4: 6
Process 5: 7
Process 6: 8
Process 7: 9
Process 8: 10
Process 0: 2
Process 1: 3
Process 2: 4
3Process 3: 5

Process 4: 6
Process 5: 7
Process 6: 8
Process 7: 9
Process 8: 10
4
Process 0: 3
Process 1: 4
Process 2: 6
Process 3: 7
Process 4: 8
Process 5: 9
Process 6: 10
Process 7: 11
Process 8: 12

python多进程共享多维Array

在 Python 中,使用multiprocessing模块的Array来共享多维数组在多进程中需要用到一些特殊的技巧。

首先,你需要定义一个共享内存,并在多个进程中共享该内存。例如,如果你想要共享一个3维数组,可以定义一个二维共享内存数组,然后再在每个进程中访问它,它仍然是共享的。

下面是一个示例代码,该代码演示了如何在两个进程中共享一个3维数组:

代码

from multiprocessing import Process, Array
import time
import numpy as np


def print_array(arr, shape):
    while True:
        print("Process: \n")
        print(np.array(arr).reshape(shape))
        time.sleep(1)


def set_array(arr, shape):
    while True:
        np.random.shuffle(arr)
        time.sleep(1)
        print("Shuffled the array")


if __name__ == "__main__":
    shape = (2, 3, 4)
    arr = Array('d', np.arange(np.prod(shape)))
    process1 = Process(target=print_array, args=(arr, shape))
    process2 = Process(target=set_array, args=(arr, shape))

    process1.start()
    process2.start()

    process1.join()
    process2.join()

在上面的代码中,我们使用了multiprocessing库中的Array来实现多进程共享一个3维数组,它们可以在两个独立的进程中读取和修改这个数组。打印结果可能是一个不断变化的3维数组,每隔1秒进行重新洗牌。

运行结果

Process: 
[[[ 0.  1.  2.  3.]
  [ 4.  5.  6.  7.]
  [ 8.  9. 10. 11.]]

 [[12. 13. 14. 15.]
  [16. 17. 18. 19.]
  [20. 21. 22. 23.]]]

警告信息

UserWarning: you are shuffling a 'SynchronizedArray' object which is not a subclass of 'Sequence'; `shuffle` is not guaranteed to behave correctly. E.g., non-numpy array/tensor objects with view semantics may contain duplicates after shuffling.

np.random.shuffle(arr)

np.random.shuffle是numpy库中的一个函数,它可以对一维数组进行随机打乱。

语法:

numpy.random.shuffle(x)

参数:

  • x:需要打乱的一维数组。

返回值:

  • 无返回值,直接对数组进行打乱。

该函数在使用时需要注意,不保证所有情况下都会正确实现。例如,具有视图语义的非numpy数组/张量对象在洗牌后可能会包含重复的元素。

### Python 多进程间的共享内存实现与使用 为了减少应用程序的内存占用并提高性能,在Python中可以利用`multiprocessing`模块中的共享内存在多个进程中传递数据。下面展示了一个简单的例子来说明如何创建和访问共享内存对象。 #### 创建共享数组 当需要在不同子进程之间共享数值型的数据时,可以通过`Array`类实例化一个共享数组: ```python from multiprocessing import Process, Array def f(n, a): n.value = 3.1415927 # 修改共享变量n的值 for i in range(len(a)): a[i] = -a[i] if __name__ == '__main__': num = Array('d', [0.0, 0.0]) # 定义双精度浮点数类型的共享数组num arr = Array('i', range(10)) # 定义整数类型的共享数组arr p = Process(target=f, args=(num[0], arr)) p.start() p.join() print(num[:]) print(arr[:]) ``` 这段代码展示了两个共享数组的定义方式以及它们作为参数被传递给新启动的工作函数f的方式[^1]。 #### 使用Value进行单个值共享 对于只需要跨进程共享单一简单类型(如int、float等),可以直接采用`Value`方法: ```python from multiprocessing import Value counter = Value('i', 0) # 初始化计数器为零 with counter.get_lock(): counter.value += 1 # 增加计数器的值 ``` 这里需要注意的是,在修改共享资源之前应当获取锁以防止竞争条件的发生。 #### 跨平台兼容性的注意事项 值得注意的是,上述提到的方法适用于Unix-like系统;而在Windows上,则可能需要额外考虑一些细节差异,因为其底层机制有所不同。因此建议开发者们根据实际运行环境调整相应的配置选项。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值