我想对 Erlang 中的端口进行同步调用。也就是说,将一些输入发送到通过端口连接的正在运行的操作系统进程并直接获取其输出,而不是使用消息。
据说有一个
port_call
函数可以做到这一点。然而,文档说函数参数和返回值是依赖于驱动程序。我找不到有关以通常方式打开端口时使用的驱动程序的任何信息,例如通过 open_port({spawn, 'cat'}, [binary])
。
我来自 Elixir,我想要解决的问题是同时使用一个端口,其中单个外部进程持续运行,从许多虚拟机进程(如数据库)获取输入并向其返回输出。
我一直在 Elixir 和 Erlang 中寻找一种机制来保证,如果异步使用端口,其响应将准确地传递到发送相应请求的进程。
看起来Erlang建议的解决方案是在
receive
消息发送到端口后立即调用command
(可能依赖于Erlang中保证消息排序的事实),但这种技术不能与 Elixir 的 GenServer 一起使用,因为它建议不要使用它。
如果有一种方法可以在发往端口的消息上“设置 cookie”,然后在响应时将其取回,则可以将响应与请求相匹配,但我认为 Erlang 无法做到这一点时刻。
我看到的唯一解决方案是向操作系统进程添加一个装饰器,该装饰器会将此 cookie 从请求传递到响应,但这看起来很难看。
我一定错过了一些东西,因为两种语言都非常成熟。