从C ++代码到Common Lisp代码的RPC

用户名

我有两个代码库:一个用C ++编写,另一个用Common Lisp编写。我想从我的C ++代码中访问Lisp代码库中实现的特定功能。我搜索了用于从C ++调用Lisp函数的外函数接口,但似乎找不到任何东西(我发现另一个方向的FFI大多)。因此,我决定实施某种适合我要求的RPC形式:

  • 这两个代码都将在同一台计算机上运行,​​因此扩展到远程计算机调用并不重要。

  • C ++的输入将是一个Lisp样式的列表,这就是Lisp代码中的函数将作为输入的内容。

  • 每次执行该代码将进行1000次调用,因此每个远程调用的性能至关重要。

到目前为止,我已经从网络上的各种资源中学到了可能的解决方案:

  • 套接字-设置Lisp代码的实例,该实例将侦听来自C ++代码的函数调用,在给定的输入上运行该函数,然后将结果返回给C ++代码。

  • XML-RPC-在Lisp端设置XML-RPC服务器(这很容易,因为我使用Allegro Common Lisp,它提供了支持XML-RPC的API),然后将许多XML-RPC库之一用于C ++进行客户端呼叫。

我看到的这些方法的利弊似乎如下:

  • 套接字是一个低级构造,因此看起来我需要自己进行大部分连接管理,读取和解析套接字上的数据等。

  • XML-RPC似乎更适合我的需求,但是我读到它始终使用HTTP,并且没有使用UNIX域套接字的方法。因此,感觉XML-RPC可能对我的想法来说是过大的。

有没有人在实现类似的代码集成方面有任何经验?套接字和用于本地RPC的XML-RPC在性能上是否存在重大差异?关于哪种方法可能更好的任何建议将非常有帮助。同样,也将赞赏关于不同技术的建议。

编辑:这是共享功能的更多详细信息。Lisp代码中有一个可用的函数f(其复杂度足以使C ++中的重新实现变得非常昂贵)。它以两个列表L1和L2作为输入。我如何设想这种情况如下:

  • L1和L2是用C ++构建的,并发送到Lisp端并等待结果,
  • f在输入L1和L2的Lisp端调用,并将结果返回给C ++端,
  • C ++端接受结果并继续进行计算。

L1和L2的大小通常不大:

  • L1是通常包含100个元素的列表,每个元素是至多3-4个原子的列表。

  • L2也是包含<10个元素的列表,每个元素是至多3-4个原子的列表。

因此,每个RPC的数据总量可能是100s / 1000s字节的字符串。此调用是在C ++代码的每个while循环的开始进行的,因此很难给出每秒调用次数的具体数字。但是从我的实验中,我可以说它通常每秒完成10s-100s次。f不是数值计算:它是符号。如果您熟悉AI,则其本质上是在一阶逻辑中的符号统一。因此它没有副作用

巴西勒·斯塔林凯维奇

还有许多其他方法可以使两个进程进行通信。您可以阅读进程间通信Wiki页面。

参数之一是异步或同步字符。您的远程处理是一个远程过程调用(客户端的每个请求都恰好有一个来自服务器的响应)还是异步消息传递(双方都在发送消息,但是没有请求和响应的概念;双方都将传入消息处理为事件)。

另一个参数是等待时间和带宽,即交换的数据量(每条消息,例如每秒)。

即使在同一台计算机上,带宽也很重要。当然,管道或Unix套接字为您提供了非常大的带宽,例如100 MB /秒。但是有些场景可能还不够。在那种管道情况下,通常将数据从内存复制到内存(通常两次)(例如,从一个进程地址空间复制到另一地址空间)。

但是您可能会考虑使用例如CORBA在lisp方面参见CLORB,在OmniORB参见本教程),RPC / XDR或XML-RPC(在Lisp方面具有S-XML-RPC)或JSON-RPC等。 ..

如果您没有大量数据和带宽(或每秒许多请求或消息),我建议您使用文本协议(也许使用JSON或YAML或XML进行序列化),因为它比二进制协议更容易协议(BSONprotobuf等)

套接字层(可以使用unix(7) AF_UNIX套接字,简单的匿名或命名管道(7) -s或tcp(7),即TCP / IP,其优点是使您能够在两台计算机上分布计算通过网络进行通信)可能是最简单的,只要您在C ++和Lisp双方都拥有像poll(2)这样的多路复用系统调用即可您需要在两侧缓冲消息。

也许您想要MPICL-MPI位于Lisp一侧)。

我们不能为您提供更多帮助,除非您能很好地解释细节,然后再详细说明从C ++到Lisp共享的“功能”是什么(它在做什么,每秒多少个远程调用,什么数量和种类?数据,什么计算时间等...)。远程函数调用是幂等还是无效,它有副作用吗?它是无状态协议吗?

远程过程调用中涉及的实际数据类型非常重要:与共享的可读字符串相比,使用共享节点序列化复杂的[数学]循环图的成本要高得多。

给定您的最新详细信息,我建议使用JSON ...非常适合传输数据之类的抽象语法树或者,仅传输s表达式(在C ++中可能会遇到小的问题来解析它们,一旦指定并记录了约定,这真的很容易;如果叶子或符号名具有任意字符,则只需定义一个约定对它们进行编码。)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Matlab代码到C#代码的转换

来自分类Dev

汇编代码到C实践

来自分类Dev

汇编代码到C实践

来自分类Dev

Common-LISP调试(包括代码)

来自分类Dev

将代码从Common Lisp转换为Scheme

来自分类Dev

如何从 JSCL 方法调用 Common Lisp 代码

来自分类Dev

从C ++到C代码的转换,是否等效?

来自分类Dev

PregMatch PHP代码到Objective-c

来自分类Dev

从Java到C代码组织的过渡

来自分类Dev

C ASCII到十六进制代码

来自分类Dev

Quickwatch 到 C# 代码的转换

来自分类Dev

Emacs Lisp代码缩进

来自分类Dev

Lisp代码的说明

来自分类Dev

大N的结果错误的源代码。Common Lisp

来自分类Dev

C ++到C#代码转换,引用与值类型的麻烦

来自分类Dev

C#到C ++代码(使用CLI)给出错误

来自分类Dev

将C ++代码移植到C#-指针问题

来自分类Dev

将 C 代码移植到 C#/取消引用指针

来自分类Dev

在maxima中使用Lisp代码

来自分类Dev

编写快速的通用Lisp代码

来自分类Dev

编写快速的通用Lisp代码

来自分类Dev

如何在Emacs Lisp中使用Slime运行Common Lisp代码

来自分类Dev

如何在Emacs Lisp中使用Slime运行Common Lisp代码

来自分类Dev

将C ++代码部署到Github期间的.lib和.dll

来自分类Dev

在C中打印1到1000的代码如何工作?

来自分类Dev

C ++ OpenCV示例到iOS代码和UIImage

来自分类Dev

C到汇编代码-这意味着什么

来自分类Dev

将多重继承C ++代码移植到Java

来自分类Dev

从C#到VB.NET的代码转换