python 多进程之间内存共享

进程:
进程是一个独立的资源管理单元,不同进程间的资源是独立的,不能在一个进程中访问另一个进程的用户空间和内存空间。但是,进程不是孤立的,不同进程之间需要信息的交互和状态的传递,因此需要进程间数据的传递、同步和异步的机制。

当然,这些机制不能由哪一个进程进行直接管理,只能由操作系统来完成其管理和维护,Linux提供了大量的进程间通信机制,包括同一个主机下的不同进程和网络主机间的进程通信

同一主机间的信息交互:

  • 无名管道
    特点:多用于亲缘关系进程间通信,方向为单向;为阻塞读写;通信进程双方退出后自动消失
    问题:多进程用同一管道通信容易造成交叉读写问题
  • 有名管道
    FIFO,方向为单向(双向需要两个FIFO),以磁盘文件的方式存在;通信双方一方不存在则阻塞
  • 消息队列
    可用于同一主机任意多进程的通信,但其可存放的数据有限,应用于少量的数据传递
  • 共享内存
    可实现通一主机任意进程间大量数据的通信,但多进程对共享内存的访问存在着竞争
  • 文件
    文件是进程安全的

同一主机进程间的同步机制:信号量
同一主机进程间的异步机制:信号

多进程共享内存:
最简单的就是文件,文件时进程安全的
若数据量不时很大,可以用python自带的Queue,Pipe等
若数尽量很大的话,使用中间媒介,如:数据库,redis

网络主机间数据交互:

  • Socket套接字

1. 共享内存的概念:
共享内存,主要是实现进程间大量数据的传输。所谓共享内存,即在内存中开辟一段特殊的内存空间,多个进程可互斥访问,该内存空间具有自身特有的数据结构。

  • 多个进程在使用此共享内存空间时候,必须在进程地址空间与共享内存地址空间之间建立连接,即将共享内存空间挂载到进程中;
  • 共享内存是由一个进程开辟,其它任何进程都可以挂载;
  • 共享内存并不会随着进程的退出而消失,因此最后不使用此内存空间时,必须要手动删除。

2. python中共享内存模块:
python的multiprocessing模块也给我们提供了共享内存的操作

一般的变量在进程之间是没法进行通讯的,multiprocessing 给我们提供了 ValueArray 模块,他们可以在不通的进程中共同使用

假如用Process了几个子进程:

  1. 子进程继承父进程的全局变量,而且是以复制的形式完成(进程数大容易内存溢出),所以子进程修改后的全局变量只对自己和自己的子进程有影响。
  2. 父子进程不共享这些全局变量,也就是说:父进程中对全局变量的修改不影响子进程中的全局变量,同理,子进程也不影响父进程的。

为了实现父子进程的通信:value和array方法

  1. Value函数返回一个 shared memory 包装类,其中包含一个 ctypes 对象,一般 整数用 i ,字符用 c ,浮点数用 d 就可以了
  2. Array函数返回一个 shared memory 包装类,其中包含一个数组,字符串需要用 Array 来传递。
    创建一个 lock 来控制对 value 的访问,该参数可以是 Lock 也可以是 RLock 对象。

你可能感兴趣的:(进程,线程,协程)