我正在寻找有关可能的IPC机制的建议:
- 跨平台(至少Win32和Linux)
- 易于在C ++和最常用的脚本语言(perl,ruby,python等)中实现。
- 最后,从编程的角度来看简单易用!
我有什么选择?我正在Linux下进行编程,但我希望将来编写的内容可以移植到其他OS。我考虑过使用套接字,命名管道或诸如DBus之类的东西。
Answers:
在速度方面,最好的跨平台IPC机制将是管道。但是,这假定您要在同一台计算机上使用跨平台IPC。如果您希望能够与远程计算机上的进程进行对话,则可以考虑使用套接字。幸运的是,至少在谈论TCP时,套接字和管道的行为几乎相同。尽管用于设置它们和连接它们的API不同,但是它们都像数据流一样工作。
但是,困难的部分不是通信通道,而是您通过它传递的消息。您确实希望查看可以为您执行验证和解析的内容。我建议您查看Google的协议缓冲区。基本上,您将创建一个描述文件,该文件描述了要在流程之间传递的对象,并且有一个编译器以多种不同的语言生成代码,用于读取和编写与该规范匹配的对象。这比尝试自己制定一个消息传递协议和解析器要容易得多(并且不易出错)。
为什么不使用D-Bus?这是一个非常简单的消息传递系统,几乎可以在所有平台上运行,并且旨在提高健壮性。目前几乎所有的脚本语言都支持它。
如果您想要一个便携式,易于使用的多语言和LGPL ed解决方案,我建议您使用ZeroMQ:
inproc://
),进程(ipc://
)或机器({tcp|pgm|epgm}://
)之间传递消息,可以配置传输协议,使其效率更高;如果在VMware之间运行连接,则可以通过聪明的选择来减少部分协议开销虚拟机(vmci://
)。对于序列化,根据您的需要,我建议使用MessagePack或协议缓冲区(其他也已经提到)。
如何Facebook的节俭?
Thrift是用于可扩展的跨语言服务开发的软件框架。它结合了软件堆栈和代码生成引擎,以构建可在C ++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,Smalltalk和OCaml之间高效且无缝运行的服务。
我认为您需要基于套接字的东西。
如果您要使用RPC而不是IPC,我建议使用XML-RPC / SOAP之类的东西,它可以在HTTP上运行,并且可以从任何语言中使用。
YAMI-另一个消息传递基础结构是一个轻量级的消息传递和网络框架。
我可以建议您使用plibsys C库。它非常简单,轻巧且跨平台。根据LGPL发布。它提供:
使用很好的文档库很容易。由于它是用C编写的,因此可以轻松地从脚本语言进行绑定。
如果您需要在进程之间传递大型数据集(尤其是速度至关重要),则最好使用共享内存来传递数据本身,并使用套接字来通知进程已准备好数据。您可以按如下方式进行:
该方法可以以跨平台的方式实现。
分布式计算通常很复杂,强烈建议您使用现有的库或框架,而不要浪费时间。先前的发布者已经列举了其中的一些库和框架。根据您的需求,您可以选择非常低级的框架(如套接字)或高级框架(如CORBA)。不能有一个通用的“使用此”答案。您需要对分布式编程进行自我教育,然后发现为工作选择合适的库或框架要容易得多。
有一个用于ACE的广泛使用的C ++框架,称为ACE和CORBA ORB TAO(基于ACE)。有关于ACE的非常好的书籍http://www.cs.wustl.edu/~schmidt/ACE/,所以您可以看看。照顾自己!
Python有一个相当不错的IPC库:请参阅 https://docs.python.org/2/library/ipc.html
Xojo的IPCSocket类具有内置的跨平台IPC支持。尽管您显然不能用其他语言“实现”它,但是您可以在Xojo控制台应用程序中使用它,并从其他语言调用它,这对于您来说可能很简单。
在当今时代,有一个非常简单的,符合C ++ 1x的,有据可查的,与Linux和Windows兼容的开源“ CommonAPI”库:CommonAPI C ++。
如果需要,底层IPC系统是D-Bus(libdbus)或SomeIP。应用程序接口是使用一种简单的方法并针对该Franca IDL语言量身定制的。