【进程间通信】
进程间由于空间独立,资源互相无法直接获取
此时在不同的进程间传递数据就需要专门的进程间通信方法
-
和磁盘交互:
使用中间文件,但是不安全,速度慢 -
进程间通信方法(IPC):
管道、消息队列、共享内存、信号、信号量、套接字
【管道通信Pipe】
1.原理:
在内存中开辟一块空间,形成管道结构,管道对多个进程可见,进程可以通过对管道的读写操作进行通信
2.[multiprocessing.Pipe]
1.fd1,fd2 = Pipe(duplex=True)
功能:创建一个管道
参数:
duplex默认为True 表示双向管道
设置为False 表示单项管道
返回值:
返回两个管道流对象,表示管道两端
如果是双向管道,则都可以读写
如果是单向管道,则fd1只读 fd2只写
2.fd1.recv()
功能:从管道内读取信息
参数:无
返回值:读到的内容
注意:当管道内无内容的时候会阻塞
3.fd2.send(data)
功能:向管道写入内容
参数:要写的内容
注意:可以发送几乎python的任意数据类型
3.示例(双向管道):
from multiprocessing import Process,Pipe
import os,time
# 创建管道
fd1,fd2 = Pipe()
def fun(name):
time.sleep(3)
# 向管道内写入内容
fd2.send('hello' + str(name))
jobs = []
for i in range(5):
p = Process(target=fun,args=(i,))
jobs.append(p)
p.start()
for i in range(5):
# 读取管道内消息
data = fd1.recv()
print(data)
for i in jobs:
i.join()
---------------------------------------
hello0
hello1
hello2
hello4
hello3
(当设置为单向管道的时候,注意fd1和fd2的顺序,fd1是只读,fd2是只写)
【消息队列】
1.队列特征:先进先出
在内存中开辟队列结构空间,对多个进程可见。多个进程向队列存入消息,取出消息,完成进程间通信
2.创建队列:
from multiprocessing import Queue
1.q = Queue(maxsize=0)
功能:创建队列
参数:maxsize默认表示根据系统分配空间存储消息
如果传入一个正整数则表示最多存入消息数量
返回值:队列对象
2.q.put(data[,block,timeout])
功能:向队列中存入消息
参数:
data:存入的数据(支持python数据类型)
block:默认为True,表示当队列满时阻塞
设置为False,表示非阻塞
timeout:当block为True时,表示超时时间
3.data = q.get([block,timeout])
功能:从队列获取消息
参数:
block:默认为True,表示当队列空时阻塞
设置为False,表示非阻塞
timeout:当block为True时,表示超时时间
返回值:返回获取到的消息
4.q.full()
功能:判断队列是否为满,满返回True
5.q.empty()
功能:判断队列是否为空,空返回True
6.q.qsize()
功能:获取队列中消息数量,(得到当前队列中消息的个数)
7.q.close()
功能:关闭队列
3.示例:
from multiprocessing import Queue,Process
import time
# 创建消息队列
q = Queue()
def fun1():
time.sleep(1)
# q.put('我是进程1')