进程间通信(IPC)
- 必要性:进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信。
- 常用进程间通信方法
管道 消息队列 共享内存 信号 信号量 套接字
管道通信(Pipe)
1.通信原理
在内存中开辟管道空间,生成管道操作对象,多个进程使用同一个管道对象进行读写即可实现通信
from multiprocessing import Pipe
fd1,fd2 = Pipe(duplex True)
功能:创建管道
参数:默认表示双向管道
如果为False 表示单向管道
返回值:表示管道两端的读写对象
如果是双向管道均可读写
如果是单向管道fd1只读
fd2只写
recv 是读,send是写
fd.recv()
功能:从管道获取内容
返回值:获取到的数据
fd.send(data)
功能:向管道写入内容
参数:要写入的数据
注意
- multiprocessing中管道通信只能用于有亲缘关系进程中
- 管道对象在父进程中创建,子进程通过父进程获取
import time
from multiprocessing import Pipe,Process
fd1, fd2 = Pipe()
def app1():
print("启动APP 1,请登录")
print("请求APP2 ,授权")
fd1.send("app1 请求登录")
data=fd1.recv()
if data:
print("登录成功")
def app2():
print("APP2 等待接收")
data=fd2.recv()
print(data)
fd2.send(("Dave","123456"))
if __name__ == '__main__':
p1 = Process(target=app1)
p2 = Process(target=app2)
p1.start()
p2.start()
p1.join()
p2.join()
消息队列
1.通信原理
在内存中建立队列模型,进程通过队列将消息存入,或者从队列取出完成进程间通信。
2.实现方法
from multiprocessing import Queue
q=Queue(maxsize=0)
功能:创建队列对象
参数:最多存放消息个数
返回值:队列对象
q.put(data,[block,timeout])
功能:向队列存入消息
参数:data要存入的内容
block :设置是否阻塞 False为非阻塞
timeout 超时检测
q.get([block,timeout])
功能:从队列取出消息
参数:block 设置是否阻塞 False为非阻塞
timeout 超时检测
返回值:返回获取到的内容
共享内存
1.通信原理:在内中开辟一块空间,进程可以写入内容和读取内容完成通信,但是每次写入内容会覆盖之前内容。
2.实现方法
from multiprocessing import Value,Array
obj Value(ctype,data)
功能:开辟共享内存
参数:ctype
表示共享内存空间类型·i'·f·'c
data :共享内存空间初始数据
返回值:共享内存对象
obj.value 对该属性的修改查看即对共享内存读写
obj=Array(ctype,data)
功能:开辟共享内存空间
参数:ctype
表示共享内存数据类型
data
整数则表示开辟空间的大小,其他数据类型表示开辟空
返回值:共享内存对象
信号量
1.通信原理
给定一个数量对多个进程可见。多个进程都可以操作该数量增减,并根据数量值决定自己的行为。
from multiprocessing import Semaphore
sem=Semaphore(num)
功能:创建信号量对象
参数:信号量的初始值
返回值:信号量对象
sem.acquire()
将信号量减1当信号量为时阻塞
sem.release()将信号量加1
sem.get_value()获取信号量数量