@chengweihuang
2019-02-13T08:09:47.000000Z
字数 1172
阅读 521
每日总结
管道 消息队列 共享内存 信号
通信原理 : 在内存中开辟管道空间,生成管道操作对象,多个进程使用"同一个"管道对象进行操作即可实现通信
fd1,fd2 = Pipe(duplex = True)
功能 : 创建管道
参数 : 默认表示双向管道
如果设置为False则为单向管道
返回值 : 表示管道的两端
如果是双向管道 都可以读写
如果是单向管道 则fd1只读 fd2只写
from multiprocessing import Process,Pipeimport os,time#创建管道对象fd1,fd2 = Pipe(False)def fun(name):time.sleep(3)#向管道写入内容fd2.send([1,2,3,4,5])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()
队列 : 先进先出
通信原理 : 在内存中建立队列数据结构模型。多个进程都可以通过队列存入内容,取出内容的顺序和存入顺序保持一致
创建队列
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() 关闭队列
from multiprocessing import Queuefrom time import sleep#创建队列q = Queue(3)q.put(1)sleep(0.5)print(q.empty())q.put(2)print(q.full())q.put(3)print(q.qsize())# q.put(4,True,3)print(q.get())q.close() #关闭队列
共享内存
通信原理:在内存空开辟一块空间,对多个进程可见,进程可以写入输入,但是每次写入的内容会覆盖之前的内容。
管道 消息队列 共享内存
开辟空间 内存 内存 内存
读写方式 两端读写 先进先出 覆盖之前内容
双向/单向
效率 一般 一般 较高
应用 多用于父 广泛灵活 需要注意
子进程 进行互斥操作