
1、无名管道通信:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用;
2、高级管道通信:将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程;
3、有名管道通信:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信;
4、消息队列通信:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识;
5、信号量通信:信号量是一个计数器,可以用来控制多个进程对共享资源的访问;
6、信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
7、共享内存通信:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问;
8、套接字通信:套接口也是一种进程间通信机制。
数据通信方式
计算机网络中传输的信息都是数字数据,计算机之间的通信就是数据通信方式,数据通信是计算机和通信线路结合的通信方式。
根据所允许的传输方向,数据通信方式可分成单工通信、半双工通信、双工通信三种方式。
基本信息
中文名 数据通信方式
分类 通信
主要应用 数据传输
通信方式
按照数据在线路上的传输方向,通信方式可分为:单工通信、半双工通信与全双工通信。
单工通信只支持数据在一个方向上传输,又称为单向通信。如无线电广播和电视广播都是单工通信。
半双工通信允许数据在两个方向上传输,但在同一时刻,只允许数据在一个方向上传输,它实际上是一种可切换方向的单工通信。即通信双方都可以发送信息,但不能双方同时发送,(当然也不能同时接受)。这种方式一般用于计算机网络的非主干线路中。
全双工通信允许数据同时在两个方向上传输,又称为双向同时通信,即通信的双方可以同时发送和接收数据。如现代电话通信提供了全双工传送。这种通信方式主要用于计算机与计算机之间的通信。
传输方式
并行传输
并行传输指的是数据以成组的方式,在多条并行信道上同时进行传输。常用的就是将一个字符代码的几位二进制码,分别在几个并行行道上进行传输。例如,采用8单位代码的字符,可以用8个信道并行传输,一次传送一个字符,因此收、发双方不存在字符的同步问题,不需要加“起”、“止”信号或者其他信号来实现收、发双方的字符同步,这是并行传输的一个主要优点。但是,并行传输必须有并行信道,这带来了设备上或实施条件的限制。
串行传输
串行传输是构成字符的二进制代码在一条信道上以位(码元)为单位,按时间顺序逐位传输的方式。按位发送,逐位接收,同时还要确认字符,所以要采取同步措施。速度虽慢,但只需一条传输信道,投资小,易于实现,是数据传输采用的主要传输方式。也是计算机通信采取的一种主要方式。
异步传输
异步传输是字符同步传输的方式,又称起止式同步。当发送一个字符代码时,字符前面要加一个“起”信号,长度为1个码元宽,极性为“0”,即空号极性;而在发完一个字符后面加一个“止”信号,长度为1,15(国际2号代码时用)或2个码元宽,极性为“1”,即传号极性。接收端通过检测起、止信号,即可区分出所传输的字符。字符可以连续发送,也可单独发送,不发送字符时,连续发送止信号。每一个字符起始时刻可以是任意的,一个字符内码元长度是相等的,接收端通过止信号到起信号的跳变(“1” “0”)来检测一个新字符的开始。该方式简单,收、发双方时钟信号不需要精确同步。缺点是增加起、止信号,效率低,使用于低速数据传输中。
同步传输
同步传输是位(码元)同步传输方式。该方式必须在收、发双方建立精确的位定时信号,以便正确区分每位数据信号。在传输中,数据要分成组(或称帧),一帧含多个字符代码或多个独立码元。在发送数据前,在每帧开始必须加上规定的帧同步码元序列,接收端检测出该序列标志后,确定帧的开始,建立双方同步。接收端DCE从接收序列中提取位定时信号,从而达到位(码元)同步。同步传输不加起、止信号,传输效率高,使用于2 400 bit/s以上数据传输,但技术比较复杂。
21 文件映射
文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O *** 作,只需简单的指针 *** 作就可读取和修改文件的内容。
Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。
应用程序有三种方法来使多个进程共享一个文件映射对象。
(1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。
(2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。
(3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。
文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。
22 共享内存
Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替
文件句柄(HANDLE),就表示了对应的文件映射对象是从 *** 作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用
文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
23 匿名管道
管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。
匿名管道(Anonymous Pipe)是 在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管
道,然后由要通信的子进程继承通道的读端点句柄或写 端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程
可以使用管道直接通信,不需要通过父进程。
匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。
24 命名管道
命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不
同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。
25 邮件槽
邮件槽(Mailslots)提 供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给
邮件槽服务器进程发送消息。进来的消 息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个
邮件槽实现进程间的双向通信。
通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收,而
命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送
和接收消息的另一种选择。
26 剪贴板
剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个
中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制 *** 作时,应
用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
剪贴板
是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;对非
标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以
转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。
27 动态数据交换
动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。
DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板 *** 作几乎
总是用作对用户指定 *** 作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三
种数据交换方式:
(1) 冷链:数据交换是一次性数据传输,与剪贴板相同。
(2) 温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。
(3) 热链:当数据交换时服务器自动给客户发送数据。
DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE。
28 对象连接与嵌入
应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服
务。例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原
始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。
同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术。
29 动态连接库
Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。
虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。
210 远程过程调用
Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用。
由于Win32 API提供的RPC服从OSF-
DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过
Win32 API编写的RPC应用程序能与其它 *** 作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程
序。
211 NetBios函数
Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios函数来进行进程间通信。
212 Sockets
Windows Sockets规范是以UCBerkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网
络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机
制进行编程。
现在通过Sockets实现进程通信的网络应用越来越多,这主要的原因是Sockets的跨平台性要比其它IPC机制好得多,另
外WinSock 20不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信 *** 作,这使得在单机
的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA消息将更合适些。
213 WM_COPYDATA消息
WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目
的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了
数据共享。
WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。
程序间通讯方式
用于程序间通讯(IPC)的四种不同技术: 1 讯息传递(管道,FIFO,posix和system v讯息伫列) 2 同步(互斥锁,条件变数,读写锁,档案和记录锁,Posix和System V讯号灯) 3 共享记忆体区(匿名共享记忆体区,有名Posix共享记忆体区,有名System V共享记忆体区) 4 过程呼叫(Solaris门,Sun RPC) 讯息伫列和过程呼叫往往单独使用,也就是说它们通常提供了自己的同步机制相反,共享记忆体区通常需要由应用程式提供的某种同步形式才能正常工作解决某个特定问题应使用哪种IPC不存在简单的判定,应该逐渐熟悉各种IPC形式提供的机制,然后根据特定应用的要求比较它们的特性 必须考虑的四个前提: 1 联网的还是非联网的IPC适用于单台主机上的程序或执行绪间的如果应用程式有可能分布到多台主机上,那就要考虑使用套接字代替IPC,从而简化以后向联网的应用程式转移的工作 2 可移植性 3 效能,在具体的开发环境下执行测试程式,比较几种IPC的效能差异 4 实时排程如果需要这一特性,而且所用的系统也支援posix实时排程选项,那就考虑使用Posix的讯息传递和同步函式 各种IPC之间的一些主要差异: 1 管道和FIFO是位元组流,没有讯息边界Posix讯息和System V讯息则有从传送者向接受者维护的记录边界(eg:TCP是没有记录边界的位元组流,UDP则提供具有记录边界的讯息) 2 当有一个讯息放置到一个空伫列中时,Posix讯息伫列可向一个程序传送一个讯号,或者启动一个新的执行绪System V则不提供类似的通知形式 3 管道和FIFO的资料位元组是先进先出的Posix讯息和System V讯息具有由传送者赋予的优先顺序从一个Posix讯息伫列读出时,首先返回的总是优先顺序最高的讯息从一个System V讯息伫列读出时,读出者可以要求想要的任意优先顺序的讯息 4 在众多的讯息传递技术—管道,FIFO,Posix讯息伫列和System V讯息伫列—中,可从一个讯号处理程式中呼叫的函式只有read和write(适用于管道和FIFO) 比较不同形式的讯息传递时,我们感兴趣的有两种测量尺度: 1 频宽(bandwidth):资料通过IPC通道转移的速度为测量该值,我们从一个程序向另一个程序传送大量资料(几百万位元组)我们还给不同大小的I/O *** 作(例如管道和FIFO的write和read *** 作)测量该值,期待发现频宽随每个I/O *** 作的资料量的增长而增长的规律 2 延迟(latency):一个小的IPC讯息从一个程序到令一个程序再返回来所花的时间我们测量的是只有一个1个位元组的讯息从一个程序到令一个程序再回来的时间(往返时间) 在现实世界中,频宽告诉我们大块资料通过一个IPC通道传送出去需花多长时间,然而IPC也用于传递小的控制资讯,系统处理这些小讯息所需的时间就由延迟提供这两个数都很重要
程序和执行绪的区别,程序间通讯方式有哪程序间和执行绪间的协作区别:
程序互斥、同步的概念
程序互斥、同步的概念是并发程序下存在的概念,有了并发程序,就产生了资源的竞争与协作,从而就要通过程序的互斥、同步、通讯来解决资源的竞争与协作问题。
下面是根据《作业系统教程》314 中的介绍,整理的程序互斥、同步的概念。
在多道程式设计系统中,同一时刻可能有许多程序,这些程序之间存在两种基本关系:竞争关系和协作关系。
程序的互斥、同步、通讯都是基于这两种基本关系而存在的,为了解决程序间竞争关系(间接制约关系)而引入程序互斥;为了解决程序间松散的协作关系( 直接制约关系)而引入程序同步;为了解决程序间紧密的协作关系而引入程序通讯。
第一种是竞争关系
系统中的多个程序之间彼此无关,它们并不知道其他程序的存在,并且也不受其他程序执行的影响。例如,批处理系统中建立的多个使用者程序, 分时系统中建立的多个终端程序。由于这些程序共用了一套计算机系统资源,因而, 必然要出现多个程序竞争资源的问题。当多个程序竞争共享硬装置、储存器、处理器 和档案等资源时,作业系统必须协调好程序对资源的争用。
资源竞争出现了两个控制问题:一个是死锁 (deadlock )问题,一组程序如果都获得了部分资源,还想要得到其他程序所占有的资源,最终所有的程序将陷入死锁。另一个是饥饿(starvation )问题,这是指这样一种情况:一个程序由于其他程序总是优先于它而被无限期拖延。
作业系统需要保证诸程序能互斥地访问临界资源,既要解决饥饿问题,又要解决死锁问题。
程序的互斥(mutual exclusion )是解决程序间竞争关系( 间接制约关系) 的手段。 程序互斥指若干个程序要使用同一共享资源时,任何时刻最多允许一个程序去使用,其他要使用该资源的程序必须等待,直到占有资源的程序释放该资源。
第二种是协作关系
某些程序为完成同一任务需要分工协作,由于合作的每一个程序都是独立地以不可预知的速度推进,这就需要相互协作的程序在某些协调点上协 调各自的工作。当合作程序中的一个到达协调点后,在尚未得到其伙伴程序发来的讯息或讯号之前应阻塞自己,直到其他合作程序发来协调讯号或讯息后方被唤醒并继续执行。这种协作程序之间相互等待对方讯息或讯号的协调关系称为程序同步。
程序间的协作可以是双方不知道对方名字的间接协作,例如,通过共享访问一个缓冲区进行松散式协作;也可以是双方知道对方名字,直接通过通讯机制进行紧密协作。允许程序协同工作有利于共享资讯、有利于加快计算速度、有利于实现模组化程式设计。
程序的同步(Synchronization)是解决程序间协作关系( 直接制约关系) 的手段。程序同步指两个以上程序基于某个条件来协调它们的活动。一个程序的执行依赖于另一
个协作程序的讯息或讯号,当一个程序没有得到来自于另一个程序的讯息或讯号时则需等待,直到讯息或讯号到达才被唤醒。
不难看出,程序互斥关系是一种特殊的程序同步关系,即逐次使用互斥共享资源,也是对程序使用资源次序上的一种协调。
列举linux程序间通讯方式,linux pthread执行绪同步的方式有哪些程序间通讯程序间通讯就是不同程序之间传播或交换资讯,程序的使用者空间是互相独立的,程序之间可以利用系统空间交换资讯。 管道(pipe)管道是一种半双工的通讯方式,资料只能单向流动。如果要进行双工通讯,需要建立两个管道。 管道只能在具有亲
要传输大约1MB的资料,应该用哪种程序间通讯方式最佳Simpson and Sons
54 Madison Street
Sydney, Australia
7th November 2008
Dear Person-in-charge,
Re: Amendments of L/C No 5058
We are writing to amend L/C No 5058 of 3,000 dozens of Poplin Shirts as follows:
1) The beneficiary pany should be Pacific Trading Co, Ltd as opposed to Oriental Trading Co, Ltd
2) The credit terms should be cash on delivery instead of 60 days credit terms
3) The trade term or price term should be CFRC3 Marseilles in instead of CFR Marseilles
4) The total transaction amount should be USD 300,00000 and not GBP 300,00000
We apologized for any inconvenience caused Please kindly make the following amendments as soon as possible and do not hesitate to contact me at xxx-xxxx-xxxx should you required further information
Thank you
Yours truly,
XXX
程序间同步是程序间通讯吗管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系程序间的通讯,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系程序间的通讯; 讯号(Signal):讯号是比较复杂的通讯方式,用于通知接受程序有某种事件发生,除了用于程序间通讯外,程序还可以传送讯号给程序本身;linux除了支援Unix早期讯号语义函式sigal外,还支援语义符合Posix1标准的讯号函式sigaction(实际上,该函式是基于BSD的,BSD为了实现可靠讯号机制,又能够统一对外介面,用sigaction函式重新实现了signal函式); 报文(Message)伫列(讯息伫列):讯息伫列是讯息的连结表,包括Posix讯息伫列system V讯息伫列。有足够许可权的程序可以向伫列中新增讯息,被赋予读许可权的程序则可以读走伫列中的讯息。讯息伫列克服了讯号承载资讯量少,管道只能承载无格式位元组流以及缓冲区大小受限等缺点。 共享记忆体:使得多个程序可以访问同一块记忆体空间,是最快的可用IPC形式。是针对其他通讯机制执行效率较低而设计的。往往与其它通讯机制,如讯号量结合使用,来达到程序间的同步及互斥。 讯号量(semaphore):主要作为程序间以及同一程序不同执行绪之间的同步手段。 套介面(Socket):更为一般的程序间通讯机制,可用于不同机器之间的程序间通讯。
程序间通讯方式中一般公司用的最多的是哪几个?做嵌入式的
pipe, fifo, 讯息伫列,共享记忆体这些传统的程序间通讯方式公司一般都不用,虽然共享记忆体可能快一点点,但是带来的维护开销等是很大的,公司一般会用socket也就是网路通讯的方式,或者是用资料库,程序1写资料库,程序2去读。我说的是linux系统。
python程序间通讯怎么理解在26才开始使用
multiprocessing 是一个使用方法类似threading模组的程序模组。允许程式设计师做并行开发。并且可以在UNIX和Windows下执行。
通过建立一个Process 型别并且通过呼叫call()方法spawn一个程序。
一个比较简单的例子:
#!/usr/bin/env python
from multiprocessing import Process
import time
def f(name):
timesleep(1)
print 'hello ',name
print osgetppid() #取得父程序ID
print osgetpid() #取得程序ID
process_list = []
if __name__ == '__main__':
for i in range(10):
p = Process(target=f,args=(i,))
pstart()
process_listappend(p)
for j in process_list:
jjoin()
程序间通讯:
有两种主要的方式:Queue、Pipe
1- Queue类几乎就是QueueQueue的复制,示例:
#!/usr/bin/env python
from multiprocessing import Process,Queue
import time
def f(name):
timesleep(1)
qput(['hello'+str(name)])
process_list = []
q = Queue()
if __name__ == '__main__':
for i in range(10):
p = Process(target=f,args=(i,))
pstart()
process_listappend(p)
for j in process_list:
jjoin()
for i in range(10):
print qget()
2- Pipe 管道
#!/usr/bin/env python
from multiprocessing import Process,Pipe
import time
import os
def f(conn,name):
timesleep(1)
connsend(['hello'+str(name)])
print osgetppid(),'-----------',osgetpid()
process_list = []
parent_conn,child_conn = Pipe()
if __name__ == '__main__':
for i in range(10):
p = Process(target=f,args=(child_conn,i))
pstart()
process_listappend(p)
for j in process_list:
jjoin()
for p in range(10):
print parent_connrecv()
Pipe()返回两个连线类,代表两个方向。如果两个程序在管道的两边同时读或同时写,会有可能造成corruption
程序间同步
multiprocessing contains equivalents of all the synchronization primitives from threading
例如,可以加一个锁,以使某一时刻只有一个程序print
#!/usr/bin/env python
from multiprocessing import Process,Lock
import time
import os
def f(name):
lockacquire()
timesleep(1)
print 'hello--'+str(name)
print osgetppid(),'-----------',osgetpid()
lockrelease()
process_list = []
lock = Lock()
if __name__ == '__main__':
for i in range(10):
p = Process(target=f,args=(i,))
pstart()
process_listappend(p)
for j in process_list:
jjoin()
程序间共享状态 Sharing state beeen processes
当然尽最大可能防止使用共享状态,但最终有可能会使用到
1-共享记忆体
可以通过使用Value或者Array把资料储存在一个共享的记忆体表中
#!/usr/bin/env python
from multiprocessing import Process,Value,Array
import time
import os
def f(n,a,name):
timesleep(1)
nvalue = name name
for i in range(len(a)):
a[i] = -i
process_list = []
if __name__ == '__main__':
num = Value('d',00)
arr = Array('i',range(10))
for i in range(10):
p = Process(target=f,args=(num,arr,i))
pstart()
process_listappend(p)
for j in process_list:
jjoin()
print numvalue
print arr[:]
输出:
jimin@Jimin:~/projects$ python pppy
810
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
'd'和'i'引数是num和arr用来设定型别,d表示一个双精浮点型别,i表示一个带符号的整型。
更加灵活的共享记忆体可以使用multiprocessingsharectypes模组
Server process
Manager()返回一个manager型别,控制一个server process,可以允许其它程序通过代理复制一些python objects
支援list,dict,Namespace,Lock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value,Array
例如:
#!/usr/bin/env python
from multiprocessing import Process,Manager
import time
import os
def f(d,name):
timesleep(1)
d[name] = name name
print d
process_list = []
if __name__ == '__main__':
manager = Manager()
d = managerdict()
for i in range(10):
p = Process(target=f,args=(d,i))
pstart()
process_listappend(p)
for j in process_list:
jjoin()
print d
输出结果:
{2: 4}
{2: 4, 3: 9}
{2: 4, 3: 9, 4: 16}
{1: 1, 2: 4, 3: 9, 4: 16}
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 8: 64}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
Server process managers比共享记忆体方法更加的灵活,一个单独的manager可以被同一网路的不同计算机的多个程序共享。
比共享记忆体更加的缓慢
使用工作池 Using a pool of workers
Pool类代表 a pool of worker processes
It has methods which allows tasks to be offloaded to the worker processes in a few different ways
c#多执行绪之间通讯方式有几种多执行绪通讯的方法主要有以下三种: 1全域性变数 程序中的执行绪间记忆体共享,这是比较常用的通讯方式和互动方式。 注:定义全域性变数时最好使用volatile来定义,以防编译器对此变数进行优化。 2Message讯息机制 常用的Message通讯的介面主要有两个
windows程序间通讯和linux相同吗# 管道( pipe ):管道是一种半双工的通讯方式,资料只能单向流动,而且只能在具有亲缘关系的程序间使用。程序的亲缘关系通常是指父子程序关系。 # 有名管道 (named pipe) : 有名管道也是半双工的通讯方式,但是它允许无亲缘关系程序间的通讯。
单工通信(Simplex Communication)是指消息只能单方向传输的工作方式。
在单工通信中,通信的信道是单向的,发送端与接收端也是固定的,即发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息。基于这种情况,数据信号从一端传送到另外一端,信号流是单方向的。
例如:生活中的广播就是一种单工通信的工作方式。广播站是发送端,听众是接收端。广播站向听众发送信息,听众接收获取信息。广播站不能作为接收端获取到听众的信息,听众也无法作为发送端向广播站发送信号。
通信双方采用“按——讲”(Push To Talk,PTT)单工通信属于点到点的通信。根据收发频率的异同,单工通信可分为同频通信和异频通信。
以上就是关于进程之间有哪几种通信方式全部的内容,包括:进程之间有哪几种通信方式、数据通信的传输方式有哪些、MFC如何实现进程间的通信等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)