进程间通信(IPC)
产生原因:进程空间相对独立,资源无法相互获取,此时在不同进程间通信需要专门方法。
进程间通信方法:管道 消息队列 共享内存 信号 信号量 套接字
管道通信 Pipe
通信原理:在内存中开辟管道空间,生成管道操作对象,多个进程使用"同一个"管道对象进行操作即可实现通信
pultiprocessing ---> Pipe
fd1,fd2 = Pipe(duplex = True)
功能: 创建管道
参数: 默认表示双向管道,如果设置为False则为单向管道
返回值:表示管道的两端,如果是双向管道,都可以读写,如果是单向管道 则fd1只读,fd2只写
fd.recv()
功能:从管道读取信息
返回值:读取到的内容
*如果管道为空则阻塞
fd.send(data)
功能:向管道写入内容
参数:要写入的内容
*可以发送python数据类型
消息队列
队列:先进先出
通信原理:在内存中建立队列数据结构模型。多个进程都可以通过队列存入内容,取出内容的顺序和存入顺序保持一致
创建队列:
q = Queue(maxsize = 0)
功能:创建消息队列
参数:表示最多存放多少消息。默认表示根据内存分配存储
返回值:队列对象
q.put(data,[block,timeout])
功能:向队列存储消息
参数:data 要存的内容
block 默认队列满时会阻塞,设置为False则非阻塞
timeout 超时时间
data = q.get([block,timeout])
功能:获取队列消息
参数:block 默认队列空时会阻塞,设置为False则非阻塞
timeout 超时时间
返回值:返回取出的内容
q.full()判断队列是否为满
q.empty()判断队列是否为空
q.qsize()判断队列中消息数量
q.close()关闭队列
共享内存
通信原理:在内存空开辟一块空间,对多个进程可见,进程可以写入输入,但是每次写入的内容会覆盖之前的内容。
obj = Value(ctype,obj)
功能: 开辟共享内存空间
参数 : ctype 要存储的数据类型
obj 共享内存的初始化数据
返回:共享内存对象
obj.value 即为共享内存值,对其修改即修改共享内存
obj = Array(ctype,obj)
功能 : 开辟共享内存空间
参数 : ctype 要存储的数据格式
obj 初始化存入的内容 比如列表,字符串
如果是整数则表示开辟空间的个数
返回值 : 返回共享内存对象
* 可以通过遍历过户每个元素的值
e.g. [1,2,3] ---> obj[1] == 2
* 如果存入的是字符串
obj.value 表示字符串的首地址
管道 消息队列 共享内存
开辟空间 内存 内存 内存
读写方式 两端读写 先进先出 覆盖之前内容
双向/单向
效率 一般 一般 较高
应用 多用于父 广泛灵活 需要注意
子进程 进行互斥操作
信号通信
一个进程向另一个进程发送一个信号来传递某种讯息,接受者根据接收到的信号进行相应的行为
kill -l 查看系统信号
kill -sig PID 向一个进程发送信号
SIGHUP连接断开
SIGINTCTRL+C
SIGQUITCTRL+\
SIGTSTPCTRL+Z
SIGKILL终止一个进程
SIGSTOP暂停一个进程
SIGALRM时钟信号
SIGCHLD子进程状态改变时给父进程发出
python 发送信号
需要引入 signal 模块
os.kill(pid,sig)
功能: 发送信号
参数: pid 目标进程
sig 要发送的信号
如:os.kill(20959,signal.SIGKILL)