码迷,mamicode.com
首页 > 系统相关 > 详细

进程之间通信

时间:2018-11-09 21:11:03      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:表示   属性   参数   manager   als   empty   专用   字典   imp   

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))

 

进程之间通信

标签:表示   属性   参数   manager   als   empty   专用   字典   imp   

原文地址:https://www.cnblogs.com/msj513/p/9936685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!