python实现进程通信_python实现多进程通信实例分析

电脑操作系统会为每一个建立的过程分派一个单独的详细地址室内空间,不一样过程的详细地址室内空间是彻底防护的,因而假如不用别的的对策,她们彻底觉得不上相互的存有。那麼过程中间如何开展通讯?她们中间的关系是如何的?完成基本原理是啥?文中就来依靠Python简易的聊一下过程中间的通讯?還是这句话,基本原理是同样的,期待能通过实际的事例来感受一下实质的物品。

下边尽可能以简易的方法介绍一下每一类通信方式,实际的关键点能够参考文本文档应用;

1. 管路

先看来一下非常简单、历史悠久的一种IPC:管路。一般指的是無名管路,实质上能够看作一种文档,只存有于运行内存之中,不容易存盘。不一样过程根据系统软件出示的插口来向管路中载入或是载入数据信息。

换句话说大家根据那样一个正中间物质为过程出示沟通交流的方法。無名管路的局限性取决于一般只用以有立即关联方交易的父子俩过程。下边根据一个简易的事例看来一下其使用方法。from multiprocessing import Process, Pipedef pstart(pname, conn): conn.send("Data@subprocess") print(conn.recv())# Data@parentprocessif __name__ == '__main__': conn1, conn2 = Pipe(True) sub_proc = Process(target=pstart, args=('subprocess', conn2,)) sub_proc.start() print (conn1.recv()) # Data@subprocess conn1.send("Data@parentprocess") sub_proc.join()

管路通讯三步曲: 建立Pipe,获得两个connection目标conn1和conn2; 父过程拥有conn1,将conn2传送给子过程; 父子俩过程根据对拥有的connection目标开展send和recv实际操作以开展数据信息传送和接纳;

上边大家建立的是全双工管路,还可以建立半双工管路,实际应用能够参考官方网站叙述:

Returns a pair (conn1, conn2) of Connection objects representing the ends of a pipe.

If duplex is True (the default) then the pipe is bidirectional. If duplex is False then the pipe is unidirectional: conn1 can only be used for receiving messages and conn2 can only be used for sending messages.

2. 具名管路(FIFO)

上边详细介绍的管路关键用以有立即关联的过程,局限较为大。下边看来一下能够在随意过程间开展通讯的具名管路。

因为window服务平台上os模块沒有mkfifo特性,因而这一事例只有在linux上运作(接口测试 CentOS 7, Python 2.7.5):#!/usr/bin/pythonimport os, timefrom multiprocessing import Processinput_pipe = "./pipe.in"output_pipe = "./pipe.out"def consumer(): if os.path.exists(input_pipe): os.remove(input_pipe) if os.path.exists(output_pipe): os.remove(output_pipe) os.mkfifo(output_pipe) os.mkfifo(input_pipe) in1 = os.open(input_pipe, os.O_RDONLY) # read from pipe.in out1 = os.open(output_pipe, os.O_SYNC | os.O_CREAT | os.O_RDWR) while True: read_data = os.read(in1, 1024) print("received data from pipe.in: %s @consumer" % read_data) if len(read_data) == 0:time.sleep(1)continue if "exit" in read_data:break os.write(out1, read_data) os.close(in1) os.close(out1)def producer(): in2 = None out2 = os.open(input_pipe, os.O_SYNC | os.O_CREAT | os.O_RDWR) for i in range(1, 4): msg = "msg " str(i) len_send = os.write(out2, msg) print("------product msg: %s by producer------" % msg) if in2 is None:in2 = os.open(output_pipe, os.O_RDONLY) # read from pipe.out data = os.read(in2, 1024) if len(data) == 0:break print("received data from pipe.out: %s @producer" % data) time.sleep(1) os.write(out2, 'exit') os.close(in2) os.close(out2)if __name__ == '__main__': pconsumer = Process(target=consumer, args=()) pproducer = Process(target=producer, args=()) pconsumer.start() time.sleep(0.5) pproducer.start() pconsumer.join() pproducer.join()

运作步骤以下:

每一轮的全过程以下: producer过程往pipe.in文档中载入信息数据信息; consumer过程从pipe.in文档中读取信息数据信息; consumer过程往pipe.out文档中载入回执表信息数据信息; producer过程从pipe.out文档中读取回执表信息数据信息;

結果以下:[shijun@localhost python]$ python main.py------product msg: msg 1 by producer------received data from pipe.in: msg 1 @consumerreceived data from pipe.out: msg 1 @producer------product msg: msg 2 by producer------received data from pipe.in: msg 2 @consumerreceived data from pipe.out: msg 2 @producer------product msg: msg 3 by producer------received data from pipe.in: msg 3 @consumerreceived data from pipe.out: msg 3 @producerreceived data from pipe.in: exit @consumer

2个过程沒有立即的关联,每一个过程有一个读文档和写文档,假如2个过程的读写能力文档是关系的,就可以开展通讯。

3. 消息队列(Queue)

过程中间根据向序列中加上数据信息或是从序列中读取数据来开展信息数据信息的传送。下边是一个简易的事例。from multiprocessing import Process, Queueimport timedef producer(que): for product in ('Orange', 'Apple', ''): print('put product: %s to queue' % product) que.put(product) time.sleep(0.5) res = que.get() print('consumer result: %s' % res)def consumer(que): while True: product = que.get() print('get product:%s from queue' % product) que.put('suc!') time.sleep(0.5) if not product:breakif __name__ == '__main__': que = Queue(1) p = Process(target=producer, args=(que,)) c = Process(target=consumer, args=(que,)) p.start() c.start() p.join() c.join()

这一事例非常简单,queue的实际使用方法能够参照一下官方网站。

結果:put product: Orange to queueconsumer result: suc!put product: Apple to queueconsumer result: suc!put product: to queueconsumer result: suc!get product:Orange from queueget product:Apple from queueget product: from queue

这里有几个方面必须留意下: 能够特定序列的容积,假如超过容积会出现出现异常:raise Full; 默认设置put和get均会堵塞当今过程; 假如put沒有设成堵塞,那麼很有可能自身从序列中取下自身放进的数据信息;

4. 共享内存

共享内存是一种常见的,高效率的过程中间的通信方式,为了更好地确保共享内存的井然有序浏览,必须对过程采用附加的同歩对策。文章内容来源于:www.seo-7.comwww.sEo-6.comhttp://www.seo-6.com/seoyh/seojichurm/117862.html

(编辑:部分内容来互联网)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值