小编use*_*167的帖子

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

我有两个代码库:一个用C++编写,另一个用Common Lisp编写.在Lisp代码库中实现了一个特殊的功能,我想从我的C++代码中访问它.我搜索了外部函数接口来从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端并等待结果,
  • 在输入L1和L2上的Lisp端调用f,并将结果返回给C++端,
  • C++方面接受结果并继续其计算.

L1和L2的大小通常不大:

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

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

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

c++ sockets rpc xml-rpc common-lisp

5
推荐指数
2
解决办法
725
查看次数

标签 统计

c++ ×1

common-lisp ×1

rpc ×1

sockets ×1

xml-rpc ×1