如何在 Erlang 中同步使用端口?

2024-01-07

我想对 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(使用前将#替换为@)

如何在 Erlang 中同步使用端口? 的相关文章

  • 如何在phoenix中使用session连接?

    我有一个身份验证插头 我想测试我的控制器 问题是这个插头里的线有 user id get session conn user id 当我使用这种方法时它总是为零 我以前使用过dirty hack 但我不再想这样做 session Plug
  • GenServer 正常关闭

    我使用 GenServer 编写了一个 Elixir 应用程序 该应用程序在启动时启动外部应用程序 然后将其关闭 并在退出时进行其他清理 我在中添加了启动功能init 1 https hexdocs pm elixir GenServer
  • 检查 Erlang 中的活动计时器

    有没有一种简单的方法来获取所有当前等待的计时器的列表erlang send after erlang apply after等在Erlang中 出于调试目的 您可以使用dbg 首先创建一个 ets 表来存储所有计时器引用 1 gt ets
  • 为什么 x = x +1 在 Elixir 中有效?

    我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 如果是这样 为什么 x x 1 在 Elixir 中有效 不存在 x x 1 的 x 值 我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 在长生不老
  • Erlang 更好地支持哪种数据库(SQL)?

    你建议我在 Erlang 中使用什么 MySQL 还是 Postgres 哪个数据库有更好 更成熟 更稳定 更快 的 Erlang 驱动程序 The Erlang ODBC 接口 http erlang org doc apps odbc
  • 如何在 Elixir 或 Phoenix 框架中安排代码每隔几个小时运行一次?

    假设我想每 4 小时发送一堆电子邮件或重新创建站点地图或其他任何内容 我该如何在 Phoenix 或仅使用 Elixir 做到这一点 有一个简单的替代方案 不需要任何外部依赖项 defmodule MyApp Periodically do
  • 将 erlang shell 作为守护进程/服务运行

    显然 我有一个在 Erlang shell 中运行的 Erlang 程序 我想监视它 这就是我要的 当机器启动时 Erlang shell 应该随之启动 并且在 shell 中运行的程序也应该随之启动 如果 Erlang shell 由于某
  • Mnesia:如何同时锁定多行,以便我可以写入/读取一组“一致”的记录

    我多么希望我一开始就能表达我的问题 取一个包含 26 个键 a z 的表 并让它们具有整数值 创建一个流程 哎哟 一遍又一遍地做两件事 在一笔交易中 写入随机值a b and c使得这些值always总和为 10 在另一个事务中 读取值a
  • Erlang get_tcp:recv数据长度

    I user gen tcp recv Socket 0 用于数据接收 但我只能接收1次1418字节 我怎样才能收到发送的数据量 in gen tcp recv Socket 0 您正在询问内核 给我接收缓冲区中现在可用的所有数据 不过 内
  • Erlang Mnesia 中的分页搜索

    例如 给定记录 record item id time status 我想搜索 1000 到 1100 个项目 按时间和顺序排序status lt lt finished gt gt 有什么建议么 这取决于您的查询是什么样的 如果您需要按许
  • Erlang 应该如何处理通用数据?

    假设我正在使用 Erlang 构建游戏服务器 每个用户检查某些内容 例如找到最近的玩家 是很常见的 因此通常有一个管理器类 在上面的例子中 我们使用互斥锁 据我所知 Erlang 通常会为每个 TCP 连接 用户会话 创建新的 Erlang
  • 在 digraph_utils:is_acirclic/1 返回 false 后查找循环或循环

    我怎样才能 有效地 在Erlang有向图中找到循环或循环digraph utils is acyclic 1返回假 EDIT is acyclic is 定义为 https github com erlang otp blob maint
  • Erlang 中的非终止函数类型

    我正在学习 Erlang 并尝试使用 Dialyzer 在可能的情况下获得最大的类型安全性 有一点不太明白 什么是类型非终止的函数以及如何表示它 spec 有人能解释一下吗 永远循环且永不终止的函数具有返回类型no return 该返回类型
  • 如何确定ETS表的确切内存大小?

    给定一个包含数据的 ETS 表 info 1 函数返回该表的各种属性 包括size该值特定于行数而不是物理大小 有没有办法计算 ETS 表占用的内存量 以字节为单位 ets new mytable bag named table compr
  • 如何在erlang中读取mnesia数据库的所有记录?

    我是 erlang 新手 我需要对从 mnesia 数据库获取的所有记录进行一些操作 Result mnesia dirty read mydatabase key1 key2 case Result of gt DEBUG No such
  • Erlang:将元素“添加到元组之前”

    是否可以编写一个与此函数等效的更快的函数 prepend X Tuple gt list to tuple X tuple to list Tuple 在我看来 这种事情是不被鼓励的 如果您想要一个列表 请使用一个 Erlang 入门 ht
  • Erlang 进程如何(如果有的话)映射到内核线程?

    Erlang 因能够支持许多轻量级进程而闻名 它之所以能做到这一点 是因为它们不是传统意义上的进程 甚至不是 P 线程中的线程 而是完全在用户空间中的线程 这很好 实际上很棒 那么 Erlang 线程如何在多核 多处理器环境中并行执行呢 当
  • 使用 Erlang 进行 https post 的简单示例

    我发现引用了一些使用 erlang 与 ssl 通过 rpc 和 http get 等的示例 但是我很难找到通过 erlang 将数据发布到 ssl 端点的示例 有人知道我缺少的一个简单例子吗 我想我明白了 我的论点是错误的 这就是我最终得
  • 无法启动使用 rebar 生成的示例 erlang 版本

    一般来说 我是 rebar 和 erlang 的初学者 我试图根据本教程使用 rebar 创建一个 erlang 版本 http www metabrew com article erlang rebar tutorial generate
  • Erlang dict的时间复杂度

    我想知道 Erlang OTP 是否dict模块是作为哈希表实现的 在这种情况下它是否能提供这样的性能 平均情况 Search O 1 n k Insert O 1 Delete O 1 n k 最坏的情况下 Search O n Inse

随机推荐