我想对 Erlang 中的端口进行同步调用。也就是说,将一些输入发送到通过端口连接的正在运行的操作系统进程,并直接获取其输出,而不是使用消息。
有一个port_call
据说可以做到这一点的函数。然而,文档 https://www.erlang.org/doc/man/erlang.html#port_call-3表示函数参数和返回值是依赖于驾驶员。我找不到有关以通常方式打开端口时使用的驱动程序的任何信息,例如,通过open_port({spawn, 'cat'}, [binary])
.
我来自 Elixir,我想要解决的问题是同时使用一个端口,其中单个外部进程连续运行,从许多虚拟机进程(如数据库)获取输入并将输出返回到多个虚拟机进程(如数据库)。
我一直在 Elixir 和 Erlang 中寻找一种机制来保证,如果异步使用端口,其响应将准确地传递到发送相应请求的进程。
它看起来像Erlang建议的解决方案 https://www.erlang.org/doc/tutorial/c_port.html#erlang-program是打电话receive
紧接着command
消息被发送到端口(可能依赖于 Erlang 中保证消息排序的事实),但是这种技术不能与 Elixir 的 GenServer 一起使用,因为它建议反对 https://hexdocs.pm/elixir/GenServer.html#module-receiving-regular-messages.
如果有一种方法可以在发送到端口的消息上“设置 cookie”,然后在响应时将其取回,则可以将响应与请求相匹配,但目前我认为 Erlang 无法做到这一点。
我看到的唯一解决方案是向操作系统进程添加一个装饰器,该装饰器会将这个 cookie 从请求传递到响应,但这看起来很难看。
我一定错过了一些东西,因为两种语言都非常成熟。
看一下erlexec https://github.com/saleyn/erlexec。它比内置驱动程序更加灵活和强大,并且它可能会提供您正在寻找的东西。例如,其文档 https://hexdocs.pm/erlexec/readme.html特别规定同步运行操作系统命令的示例 https://hexdocs.pm/erlexec/readme.html#running-os-commands-synchronously.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)