[关闭]
@chengweihuang 2019-02-13T08:09:47.000000Z 字数 1172 阅读 521

进程通信

每日总结


原因 : 进程空间相对独立,资源无法相互获取,此时在不同进程间通信需要专门方法

管道 消息队列 共享内存 信号

管道通信 Pipe

通信原理 : 在内存中开辟管道空间,生成管道操作对象,多个进程使用"同一个"管道对象进行操作即可实现通信
fd1,fd2 = Pipe(duplex = True)
功能 : 创建管道
参数 : 默认表示双向管道
如果设置为False则为单向管道
返回值 : 表示管道的两端
如果是双向管道 都可以读写
如果是单向管道 则fd1只读 fd2只写

  1. from multiprocessing import Process,Pipe
  2. import os,time
  3. #创建管道对象
  4. fd1,fd2 = Pipe(False)
  5. def fun(name):
  6. time.sleep(3)
  7. #向管道写入内容
  8. fd2.send([1,2,3,4,5])
  9. jobs = []
  10. for i in range(5):
  11. p = Process(target=fun,args = (i,))
  12. jobs.append(p)
  13. p.start()
  14. for i in range(5):
  15. #读取管道
  16. data = fd1.recv()
  17. print(data)
  18. for i in jobs:
  19. 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() 关闭队列

  1. from multiprocessing import Queue
  2. from time import sleep
  3. #创建队列
  4. q = Queue(3)
  5. q.put(1)
  6. sleep(0.5)
  7. print(q.empty())
  8. q.put(2)
  9. print(q.full())
  10. q.put(3)
  11. print(q.qsize())
  12. # q.put(4,True,3)
  13. print(q.get())
  14. q.close() #关闭队列

共享内存

通信原理:在内存空开辟一块空间,对多个进程可见,进程可以写入输入,但是每次写入的内容会覆盖之前的内容。

       管道         消息队列       共享内存

开辟空间 内存 内存 内存

读写方式 两端读写 先进先出 覆盖之前内容
双向/单向

效率 一般 一般 较高

应用 多用于父 广泛灵活 需要注意
子进程 进行互斥操作

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注