我有一个Go程序,出于效率原因无法在Common Lisp中重写.如何通过Common Lisp运行它?
目前的选项:
在我看来,使用外部函数接口就像是"正确"的方法.然而,我所做的研究直接导致死路一条.如果这是胜利者,有什么资源可以学习如何与Go交互?
在侦听端口的同时让Go程序一直运行会起作用.如果这是最好的方式,我会继续尝试使它工作.
这似乎是各种错误的.
还是有一种我还没想过的很棒的方式?
这取决于你想做什么,但1-3都是可行的选择
要使其工作,您需要在go和lisp方面使用FFI.您将需要从Go作为C函数extern相应的函数,然后使用来自lisp的cffi调用它们.请参阅https://golang.org/cmd/cgo/#hdr-C_references_to_Go,了解如何在go中使用extern功能.在这种情况下,您将创建一个动态可链接库(DLL或so文件)而不是可执行文件.
第二个选项是将您的go程序作为守护程序运行,并使用某种形式的IPC(如套接字)在lisp和go之间进行通信.如果您的程序长时间运行,或者如果有一个服务器和一个或多个客户端(服务器可以像转码一样容易成为lisp代码),这种方法很有效.特别是套接字也更灵活,您可以使用其他语言编写组件或更改一个组件的语言,而无需更改其他组件,只要您保持相同的协议即可.此外,您可以在单独的硬件上运行组件.但是,使用套接字可能会损害性能.还有其他可用的IPC方法,例如FIFO文件(命名管道),SHM和消息队列,但它们比套接字更依赖于系统.
第三种方法是启动子流程.这是一个可行的选择,但它有一些警告.首先,启动子进程的行为取决于lisp实现和操作系统.UIOP平滑了许多实现差异的细节,但有些太难以克服.特别是,根据实现,您可能或可能无法并行运行子进程.如果不是,则每次要与go通信时都必须运行单独的命令,这意味着每次需要时都要等待进程启动.启动后,您也可能或可能无法将输入发送到子进程.
另一种选择是运行命令以启动go进程,然后使用套接字或其他IPC与之通信,然后在关闭lisp程序之前运行命令以停止进程.
就个人而言,我认为使用套接字是最有吸引力的选择,但根据您的需要,其他选项可能更适合.
| 归档时间: |
|
| 查看次数: |
356 次 |
| 最近记录: |