进程之间通信

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

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

时间: 2024-10-14 07:22:09

进程之间通信的相关文章

进程与进程之间通信Manager

1 #!/usr/bin/env python 2 from multiprocessing import Process,Manager 3 4 #Manager进程与进程之间通信 5 def Foo(i,dic): 6 dic[i] = 100+i 7 print(dic.values()) 8 if __name__ == '__main__': 9 manage = Manager() 10 dic = manage.dict() 11 for i in range(2): 12 p =

IPC进程之间通信的几种方式

概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件. 除此以外,那就是双方都可以访问的 外设 了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”.因为那些通信手段的效率

进程之间通信之有名管道、无名管道(pipe),笔记

             进程之间的通信作用1.数据传输   :一个进程需要将他的数据传到其他进程2.资源共享3.进程通知事件4.进程控制 :有些进程完全控制另一个进程的执行,如调试状态啊我们需要完全控制他的每一步操作: 通信发展历史Linux进程间的通信IPC由以下几个部分发展而来:1.UNIX进程之间的通信2.基于system v进程间的通信3.POSIX进程之间的通信(portable operating system interface) 现在Linux使用的进程间的通信方式包括:1.管

信号量实现进程之间通信

一.信号量 信号量是一种数据操作锁,本身不具有数据交换功能,而是通过控制其他的通信资源来实现进程之间的通信,简单来讲,信号量相当于一个计数器,计数当前某种资源的个数.信号量的周期也是随内核的.为了解决多个程序同时访问一个共享资源引发的问题. 临界资源:多个进程能访问到的公共资源. 临界区:将能访问带临界资源的代码成为临界区. 同步:对临界资源的访问具有顺序性. pv 操作 p(sv)  sv>0 减1  sv=0   挂起的该进程执行 s(sv)  没有进程因等待sv而挂起就加1,有进程等待sv

linux程序设计——pipe调用在两进程之间通信(第十三章)

13.4    pipe调用 在看过高级的popen函数之后,再来看看底层的pipe函数.通过这个函数在两个程序之间传递数据不需要启动一个shell来解释请求的命令.它同时提供了对读写数据的更多控制. pipe函数的原型如下所示: #include <unistd.h> int pipe(int file_descriptor[2]); 参数:是一个由两个整数类型的文件描述符组成的数组. 返回值:该函数在数组中填上两个新的文件描述符,如果成功则返回0,如果失败则返回-1并设置errno来表明失

使用命名管道进程之间通信(转)

原文地址:http://www.cnblogs.com/yukaizhao/archive/2011/08/04/system-io-pipes.html 命名管道: 命名管道的功能比匿名管道更强大,可以在进程之间做双工通信(即通信的两个进程都是既可以读也可写的):命名管道也可以实现跨网络在不同机器之间进行通信.可以在多线程中创建多个NamedPipeServerStream实例,为多个client端服务.另外命名管道还支持消息传输,这样client端可以读取任意长度的消息,而无须知道消息的长度

跨进程(同一app不同进程之间通信)——Android自动化测试学习历程

视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877122&courseId=712011 一.问题: 1.如何做到一个app不同进程通信? 2.多个app通信(不同app) 3.注入事件运行脚本和调用隐藏api 二.一个app不同进程通信: 知识点: 1.Intent.binder 2.Service.Activity 3.Handler.view 4.Messeng

c# IPC实现本机进程之间的通信

IPC可以实现本地进程之间通信.这种用法不是太常见,常见的替代方案是使用wcf,remoting,web service,socket(tcp/pipe/...)等其他分布式部署方案来替代进程之间的通信.虽然不常见但也避免不了一些场景会使用该方案. 应用包含: 1)使用IPC技术实现多client与一个sever通信(不过是本机,感觉意义不大,但如果想实现本机上运行确实是一个不错的方案): 2)使用IPC技术实现订阅者和生产者分离时,一个server接收并消费消息,客户端是生产消息的. 1 1:

11.python并发入门(part10 多进程之间实现通信,以及进程之间的数据共享)

一.进程队列. 多个进程去操作一个队列中的数据,外观上看起来一个进程队列,只是一个队列而已,单实际上,你开了多少个进程,这些进程一旦去使用这个队列,那么这个队列就会被复制多少份. (队列=管道+锁) 这么做的主要原因就是,不同进程之间的数据是无法共享的. 下面是使用进程队列使多进程之间互相通信的示例: 下面这个例子,就是往进程队列里面put内容. #!/usr/local/bin/python2.7 # -*- coding:utf-8 -*- import multiprocessing de