进程之间通信

Posted msj513

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程之间通信相关的知识,希望对你有一定的参考价值。

IPC 指的是进程间通讯

之所以开启子进程 ,肯定需要他帮我们完成任务,很多情况下,需要将数据返回给父进程。

然而进程内存是物理隔离的

解决方案:

1.将共享数据放在文件中,就是慢

2.管道 subprocess 中那个管道只能单向通讯,必须有父子关系

3.共享一块内存区域 得操作系统帮你分配,速度快

第三钟实现Manager

from multiprocessing import Process,Manager
import time

def task(dic):
    print("子进程")
    dic["a"] = 1

if __name__ == __main__:
    # Manager 继承之间专用的与外界
    m = Manager()#开辟专用内存空间
    dic = m.dict({})#在这块内存空间生成一个字典
    # 生成公共区域的字典
    p = Process(target=task,args=(dic,))
    p.start()
    time.sleep(3)#因为进程开启速度较为慢,所以先执行父进程
    print(dic["a"])

进程之间的通讯另一种方式 使用queue

queue队列

队列的特点:

先进先出

后进后出

就放扶梯一样

from multiprocessing import Process,Queue

def task(queue):
    for i in range(3):
        queue.put(i)#将数据放入队列

if __name__ == __main__:
    q = Queue()
    p = Process(target=task,args = (q,))
    p.start()
    print(q.get())#取值规范先进先出
    print(q.get())
    print(q.get())

同时queue队列中存取值,存在阻塞,也可通过修改参数来使得

from multiprocessing import Process,Queue
import time
q = Queue(3)#限定管道中可以存放多少属性
q.put("hello",block=False)#当管道已经存满的话,存放是否接受阻塞,True接受阻塞,False不接受阻塞
q.put("world",block=False)
q.put("nice",block=False)
# q.put("12333",block=False)#放不下的直接异常 queue.Full
print(q.get(block= False))
print(q.get(block= False))
print(q.get(block= False))
# print(q.get(block=False))#当管道被被取空的话,是否接受阻塞,True接受阻塞,False不接受阻塞
#异常 _queue.Empty

timeout属性表示愿意等待的时间

# 了解
q = Queue(3)
q.put("q",timeout=3)
q.put("q2",timeout=3)
q.put("q3",timeout=3)
# 如果满了 愿意等3秒  如果3秒后还存不进去 就炸
# q.put("q4",timeout=3)

print(q.get(timeout=3))
print(q.get(timeout=3))
print(q.get(timeout=3))
# 如果没了 愿意等3秒  如果3秒后还取不到数据 就炸
print(q.get(timeout=3))

 

以上是关于进程之间通信的主要内容,如果未能解决你的问题,请参考以下文章

多个请求是多线程吗

片段和服务器之间的通信问题

与另一个片段通信的片段接口

在片段和活动之间进行通信 - 最佳实践

Linux操作系统 进程之间的通信

20160217.CCPP体系详解(0027天)