目的

可以使用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 timedef print_array(arr, n):while True:for i in range(n):print("Process {}: {}".format(i, arr[i]))time.sleep(1)test_count = 1def set_array(arr, n):global test_countwhile True:for i in range(n):arr[i] = i + test_counttime.sleep(1)test_count += 1print(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: 5Process 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 npdef 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多进程共享Array相关推荐

  1. python多进程共享内存_python 进程间通信 共享内存

    python多进程通信实例分析 python多进程通信实例分析操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那 ...

  2. python 多进程共享类实例demo

    # em = manager.Employee('zhangsan', 1000) em = Employee('zhangsan', 1000) 如果不加manager,内存数据则不会缓存,加了以后 ...

  3. python多进程共享内存

    1.问题: 群中有同学贴了如下一段代码,问为何 list 最后打印的是空值? from multiprocessing import Process, Manager import os manage ...

  4. python 多进程共享变量manager_python 进程间共享数据 multiprocessing 通信问题 — Manager...

    Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

  5. python 共享内存_37. Python 多进程锁 多进程共享内存

    Lock组件 当我们用多进程来读写文件的时候,如果一个进程是写文件,一个进程是读文件, 如果两个文件同时进行,肯定是不行的,必须是文件写结束后,才可以进行读操作. 或者是多个进程在共享一些资源的时候, ...

  6. python多进程共享变量,附共享图像内存实例

    由于python多线程只能在单核上跑,因此需要cpu多核处理只能用多进程. python多进程一般用multiprocessing.可是用multiprocessing的array或者value对内存 ...

  7. python 共享内存变量_浅谈python多进程共享变量Value的使用tips

    前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...

  8. Python 多进程开发与多线程开发

    我们先来了解什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...

  9. python多进程存储数据_Python 多进程及进程间通信

    python 因 GIL 的存在,处理计算密集型的任务时无法高效利用多核 CPU 的计算资源,这时就需要使用多进程来提高对 CPU 的资源利用.Python 多进程主要用 multiprocessin ...

  10. python 多进程 requests_python多进程(二)

    之前实现的数据共享的方式只有两种结构Value和Array.Python中提供了强大的Manager专门用来做数据共享的,Manager是进程间数据共享的高级接口. Manager()返回的manag ...

最新文章

  1. ACCESS的Ole对象读取
  2. 【Socket网络编程】3.字节序转换函数htons、htonl ,地址转换函数inet_ntoa、inet_ntop、inet_pton、inet_addr
  3. 2016级算法期末模拟练习赛-A.wuli51和京导的毕业旅行
  4. vs2010添加TSTCON( ActiveX Control Test Container )工具
  5. java elementtext_java命名空间javax.xml.stream接口xmlstreamreader成员方法: getelementtext定义参考...
  6. 服务器的数据库文件是哪个文件夹,Oracle数据库服务器参数文件管理技巧是什么?...
  7. msdb 数据库_如何检索有关存储在MSDB数据库中的SSIS包的信息
  8. 从os.cpus()来分析nodejs源码结构
  9. Android微信分享功能实例+demo
  10. 偏远的时代covid 19如何迎接下一个技术变革
  11. Floyd + 传递闭包
  12. 2021中国科学院文献情报中心期刊分区表 计算机
  13. 用python进行因式分解_Python实现的质因式分解算法示例
  14. 1.槑 2.囧 3.烎 4.兲 5.氼 6.砳 7.嘦 8.嫑 9.嘂 10.圐圙 11.玊 12.孖 13.砼 怎么读
  15. C# 之 概率随机数
  16. 量子计算是人工智能的未来吗?
  17. CCF认证 2018-09 卖菜
  18. vmware服务器文件备份,三种VMware数据备份和恢复方法
  19. Java实现 谁不爱打牌
  20. 动图静图怎么拼接在一起?教你一键快速拼接图片

热门文章

  1. c语言一个字节某位置位,C语言位操作是
  2. python大神的成长之路普通话三分钟_我的成长之路普通话三分钟
  3. kube-apiserver rbac鉴权源码分析
  4. 八款前端实用的富文本编辑器插件
  5. docker拉取镜像时报错ERROR: failed to do request: Head https://registry-1.docker.io/v2/pytorch/pytorch/manif
  6. 剑指offer:和为S的连续正数序列(Python)
  7. B站2020年Python爬虫课程第二十八课xpath作业,爬取站长素材网站获得简历文件数据
  8. JDBC的Prepar执行对象
  9. 产品研发管理(三):产品研发过程管理概述
  10. 缓存穿透、并发和失效、同步中断,最佳实践及优化方案