如何在Erlang中同步使用Port?

au9on6nz  于 2023-06-20  发布在  Erlang
关注(0)|答案(1)|浏览(151)

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

zsbz8rwp

zsbz8rwp1#

看看erlexec。它比内置的驱动程序更灵活、更强大,而且它可能提供您所需要的东西。例如,它的documentation专门提供了同步运行OS命令的示例。

相关问题