python多进程共享Array问题
目录
- 目的
- 基础知识介绍
- python多进程共享一维Array
- python多进程共享多维Array
- 总结
目的
可以使用multiprocessing库中的Array来实现多进程共享Array。
multiprocessing库是一个用于实现多进程编程的库,提供了与多进程有关的同步,通信和进程管理等功能。
在这个库中,有一个Array类,用于创建一个多进程共享的数组。
这样,每个进程都可以访问这个共享的数组,从而实现数据共享和同步。
基础知识介绍
1.multiprocessing.Array
- multiprocessing.Array是Python的多进程库中的一个数组对象,它用于在多个进程之间共享数组数据。
- Array类型是在共享内存中实现的,每个进程可以操作该数组的值。这是在多个进程间同步数据的一种常用方法,因为它们在同一内存中运行。
- 使用multiprocessing.Array,你可以创建一个共享的数组,并在多个进程中读取和修改数组的值。
- 通过使用该模块,您可以避免将数组通过管道或套接字从一个进程传递到另python一个进程的问题。
2.multiprocessing.Array 函数接受以下参数
typecode
:字符串,表示数组元素的数据类型。可用的数据类型包括 'b'(布尔),'i'(整数),'f'(浮点数),'c'(单字符),'u'(Unicode字符)等。size
:整数,表示数组的大小。lock
:布尔值,指示是否应该为数组元素创建锁(锁定)。
以上参数中,前两个是必需的,而后一个是可选的。
python多进程共享一维Array
举个例子,你可以使用multiprocessing库中的Array创建一个整型数组,并在两个进程中分别执行读取和写入操作,从而实现多进程共享Array。
- 代码
from multiprocessing import Process, Array import tiwww.devze.comme 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 seKXZSXapt_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()python 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: 0Process 2: 0Process 3: 0Process 4: 0Process 5: 0Process 6: 0Process 7: 0Process 8: 02Process 0: 1Process 1: 3Process 2: 4Process 3: 5Process 4: 6Process 5: 7Process 6: 8Process 7: 9Process 8: 10Process 0: 2Process 1: 3Process 2: 43ProcesKXZSXaps 3: 5Process 4: 6
Process 5: 7Process 6: 8Process 7: 9Process 8: 104Process 0: 3Process 1: 4Process 2: 6Process 3: 7Process 4: 8Process 5: 9Process 6: 10Process 7: 11Process 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数组/张量对象在洗牌后可能会包含重复的元素。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论