问题标签 [gen-server]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1670 浏览

erlang - Erlang:gen_server 还是我自己的自定义服务器?

我需要编写一个服务器,它将接收来自其他模块的指令并根据收到的指令采取行动。效率是我主要关心的问题。所以我使用gen_server还是编写自己的服务器。“我自己的服务器”是指:

所以要使用myserver,我可能会在启动时将进程注册到一个注册名称下,然后每个客户端都会使用这个 pid 向服务器发送消息。

那么我应该使用这种方法,还是使用这种gen_server行为来实现服务器?使用有什么好处gen_server吗?但是gen_server与 相比,使用会增加任何开销myserver吗?

0 投票
1 回答
3633 浏览

erlang - 带有 dict vs mnesia 表 vs ets 的 gen_server

我正在构建一个 erlang 服务器。用户向服务器发送 http 请求以更新其状态。服务器上的 http 请求进程将用户状态消息保存在内存中。服务器每分钟将所有消息发送到远程服务器并清除内存。如果用户在一分钟内多次更新他的状态,最后一条消息将覆盖前一条消息。重要的是,在读取所有消息和清除它们之间,没有其他进程能够写入状态消息。

实施它的最佳方法是什么?

  1. 带有字典的 gen_server。密钥将是用户 ID。dict:store/3 将更新或创建状态。gen_server 解决了“事务”问题。

  2. 带有 ram_copies 的 mnesia 表。处理事务,我不需要实现 gen_server。这个解决方案有太多开销吗?

  3. ETS 表更轻量并且有一个 gen_server。是否可以在 ETS 中进行交易?在读取所有消息和清除它们之间锁定表?

谢谢

0 投票
3 回答
366 浏览

erlang - bad_application 错误启动 erlang gen_server 应用程序

我使用 gen_server 编写了一个简单的 erlang 应用程序。

使用 application:start(myapp) 启动它时,我得到以下元组...

{error,{bad_application,{appliction,myapp ...(我的应用程序配置的其余部分)。

没有其他错误或警告消息。我还尝试搜索有关如何配置 gen_server 以及错误本身的示例。我很惊讶那里的信息如此之少。

我可以开始尝试调试 OTP 了吗?任何指针将不胜感激。

0 投票
3 回答
5060 浏览

erlang - erlang OTP Supervisor崩溃

我正在阅读 Erlang 文档,试图了解设置 OTP gen_server 和主管的基础知识。每当我的 gen_server 崩溃时,我的主管也会崩溃。事实上,每当我在命令行上出现错误时,我的主管都会崩溃。

我希望 gen_server 在崩溃时重新启动。我希望命令行错误对我的服务器组件没有任何影响。我的主管根本不应该崩溃。

我正在使用的代码是一个基本的“回声服务器”,它回复您发送的任何内容,以及一个最多每分钟重新启动回声服务器 5 次的主管(one_for_one)。我的代码:

echo_server.erl

echo_sup.erl

使用 编译erlc *.erl,这是一个示例运行:

0 投票
1 回答
576 浏览

erlang - Erlang Supervisor 重启与宕机主机连接的策略

我使用 erlang 作为服务之间的桥梁,我想知道人们对处理断开的连接有什么建议?

我从本地文件中获取输入并将它们传送到 AMQP,可以想象 AMQP 代理可能会出现故障。对于这种情况,我想继续重试连接到 AMQP 服务器,但我不想将 CPU 与这些连接尝试挂钩。我倾向于在 AMQP 代码的重新启动中休眠。那'hack'不会本质上绕过快速失败并让erlang处理它的目的吗?更一般地说,是否应该使用 erlang 主管行为来处理断开的连接?

0 投票
3 回答
422 浏览

multithreading - 瞬态 gen_server 进程和更新 pid

我目前正在以合理的方式学习 Erlang,但对主管的 gen_server 有疑问。如果 gen_server 进程崩溃并因此被主管重新启动,它会收到一个新的 pid。现在,如果我希望其他进程通过 Pid 引用该进程怎么办?在这些过程中“更新” Pid 有哪些好的惯用方法?

作为一些实际应用的练习,我正在编写一个锁服务器,客户端可以使用任意键请求锁。理想情况下,我希望有一个单独的进程来处理特定锁的锁定和释放,我的想法是如果在 N 时间后没有人请求它,我可以使用 gen_server 中的 timeout 参数来终止进程,因此只有当前相关的锁将留在内存中。现在,我有一个将锁名称映射到锁进程的目录进程。当锁定进程终止时,它会从目录中删除锁定。

我关心的是如何处理客户端请求锁定而锁定过程正在终止的情况。它还没有关闭,所以嗅探 pid 是活着的是行不通的。锁定过程尚未到达将其从目录中删除的子句。

有没有更好的方法来处理这个?

编辑

当前有两个 gen_server:“目录”维护来自 LockName -> Lock Process 的 ETS 表,以及使用 start_child 动态添加到监督树的“锁定服务器”。理想情况下,我希望每个锁服务器直接处理与客户端的对话,但我担心当进程处于崩溃中间时,获取/释放请求会被调用或强制转换发出(因此不会响应)到消息)。

以 {local} 或 {global} 开头将不起作用,因为它们可能有 N 个。

0 投票
2 回答
4982 浏览

erlang - 获取 gen_server/gen_fsm 状态以进行调试

是否可以获得gen_server进程的当前状态(大概是通过发送一些系统消息)?它在调试时可能很有用。

当然,我可以添加一条消息,将当前状态返回到handle_call

但是有内置的东西(即使它有点hacky)?

0 投票
1 回答
1826 浏览

erlang - 将 ets 表用于 gen_server 状态

我正在编写一个 gen_server,我想将 ets 表作为状态保存,然后在其他地方创建 ets 表。我应该如何将它添加到 gen_server 的状态中?

我想使用 ets 表而不是为它创建一个新字典,因为我想节省内存。

另外,如何遍历 ets 表?我想迭代或读取表中的每个值并检查值,然后我想根据值执行两个选项之一。

将ets表变成列表并遍历列表会更容易吗?

谢谢

0 投票
2 回答
3346 浏览

erlang - Erlang:在 erlang 集群中单例 gen_server 的最佳方式?

环境:

我想在 erlang 集群中启动一个唯一的全局注册 gen_server 进程。如果进程停止或运行它的节点出现故障,则该进程将在其他节点之一上启动。

该过程是主管的一部分。问题是在第二个节点上启动主管失败,因为 gen_server 已经在运行并从第一个节点全局注册。

问题):

  • 是否可以检查进程是否已经在 gen_server 的 start_link 函数中全局注册,在这种情况下返回{ok, Pid}已经运行的进程而不是启动新的 gen_server 实例?
  • 是否正确,这样一个进程将成为多个主管的一部分,如果一个进程出现故障,所有其他节点上的所有主管都会尝试重新启动该进程。第一个主管将创建一个新的 gen_server 进程,其他主管将再次链接到该进程。
  • global:trans()我应该在 gen_server 的 start_link 函数中使用某种东西吗?

示例代码:

0 投票
1 回答
916 浏览

erlang - 当主管子从 start_link 返回错误时,如何始终记录/显示错误原因?

gen_server从主管(它本身由应用程序启动)开始时,我遇到的问题是,当start_linkgen_server 没有返回{ok, ...}{error, Reason}我看到的唯一错误消息是:

Reason不显示/记录用于终止的那个。

有没有办法查看/记录这些错误返回给主管?

我正在使用的 childspec 是例如:

编辑:澄清

我知道 error_logger 并且已经在使用它。问题不是如何记录某些内容,而是如何让主管记录它终止的原因,例如记录谁因错误返回而终止以及它返回了什么。

只是为了解决这个问题,是的,我用 sasl 开始 erlang: