问题标签 [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 投票
2 回答
295 浏览

process - Trap_exit 的 Erlang 替代方案?

我想在我的 gen_server 停止时执行一些代码。我有我的 gen_server 陷阱出口(我添加process_flag(trap_exit, true)到 init 回调中)。这很有效,因为terminate/2总是在进程退出之前调用。我知道,由于我正在捕获崩溃的退出链接进程,因此不会使我创建的 gen_server 崩溃。我可以解决这个问题,但我想知道是否有替代方法process_flag(trap_exit, true)来实现这一目标?

我只想要一个“在进程退出之前”回调。还有其他类似的退出吗?

0 投票
3 回答
278 浏览

file - 检测何时将新文件添加到目录

如何检测添加到特定目录的新文件?

我正在寻找的是一个类似于 event_listener 的东西,用于创建新文件时。我对使用不断在目录中搜索新文件的循环不感兴趣,因为在将文件添加到目录时我需要文件名。

0 投票
1 回答
73 浏览

erlang - Erlang基本通用服务器调试器输出解释

我在使用 Erlang 模块时遇到了一些问题。这是我写的:

-模块(basic_gen_server)。-出口([开始/1,呼叫/2,演员/2])。

这是定义的回调模块:

尝试使用以下命令初始化服务器时:

我得到以下调试输出:

从概念上讲,我理解将串行代码制作成基本服务器系统的概念,但我相信我有一个语法错误,我无法使用语法高亮或谷歌找到它。在此先感谢您的帮助!

0 投票
1 回答
1056 浏览

erlang - Erlang:如何处理长时间运行的初始化回调?

我有一个gen_server在启动时尝试在监督树中的主管下启动一定数量的子进程(通常是 10-20)。gen_server 的 init 回调supervisor:start_child/2为每个需要的子进程调用。调用supervisor:start_child/2是同步的,因此在子进程启动之前它不会返回。所有子进程也是 gen_servers,因此 start_link 调用在 init 回调返回之前不会返回。在 init 回调中,调用了第三方系统,这可能需要一段时间才能响应(当调用第三方系统在 60 秒后超时时,我发现了这个问题)。同时 init 调用被阻塞了,这意味着supervisor:start_child/2也被阻塞了。所以整个调用的 gen_server 进程supervisor:start_child/2没有反应。在等待 start_child 函数返回时调用 gen_server 超时。因为这很容易持续 60 秒或更长时间。我想更改此设置,因为我的应用程序在等待时处于半启动状态。

解决此问题的最佳方法是什么?

我能想到的唯一解决方案是将与第三方系统交互的代码从 init 回调中移出到 handle_cast 回调中。这将使初始化回调更快。缺点是我需要gen_server:cast/2在所有子进程启动后调用。

有没有更好的方法来做到这一点?

0 投票
2 回答
779 浏览

erlang-otp - 如何在 escript 中运行 Elixir Supervisor

我有一个尽可能简单的主管和 GenServer 的混合项目。当我从 iex 打电话时:

:mumble 调用引发异常,然后 GenServer 重新启动,第二个 :echo 调用正常。

如果我以任何其他方式运行代码,Supervisor 将无法重新启动 GenServer。例如,我使用主模块创建项目的 escript,如下所示:

:mumble 调用引发异常,并且 escript 终止,而 Supervisor 没有重新启动 GenServer。

我没有包含 Supervisor 和 Server 模块代码,因为它们在从 iex 调用时工作正常,所以我猜这里不需要它们。

我有概念上的误解吗?这是不可能的,还是我做错了什么?

0 投票
2 回答
523 浏览

erlang - 如何使用 eunit 测试 gen_server 内部状态

调用回调函数后是否可以检查 gen_server 的内部状态?我宁愿不在这里更改我的服务器的 API。

0 投票
2 回答
212 浏览

erlang - Erlang中的模式不匹配

我正在打这个电话:

我希望它与:

但它总是去:

怎么了?

0 投票
1 回答
82 浏览

dictionary - Erlang tcp 服务器投票踢

我正在尝试编写一个简单的投票选项以添加到我现有的服务器中。

我有一个使用 gen_server 的消息路由器,它使用init([]) -> {ok, dict:new()}. 路由器独立于 tcp 服务器,它也是一个 gen_server,但处理 tcp 请求,然后将这些请求中继到路由器。

由于“事物”是单独处理/存储的,我想存储要被踢的用户、选民名单以及它是否成功。因此,这至少需要在路由器内以某种方式是全局的,并且最好与客户端字典分开。

关于最佳/理想方法的任何想法?
我相信我可以创建另一个 gen_server “路由器”,它存储人们以记录结构 {kick, {Votes, Passed}} 但我不知道这是否理想。

0 投票
1 回答
642 浏览

apache - Erlang inets httpc 连接到本地 inets httpd

我正在尝试使用 httpd 实现一个模块,该模块处理进程的 HTTP 获取请求。基本上它处理传入的 get 请求,解析 get 参数并在节点上调用同步 gen_server 方法,该方法启动了 http 服务器。然后,它返回一些带有来自同步调用的返回值的 HTML。一切正常,直到我用浏览器测试它(Chrome,Firefox 最新版本工作)。但是我需要实现一个 HTTP 转发功能,其中 http 服务器可以使用给定的参数调用另一个 URL。我用httpc试了一下:

但引发了以下错误:

你能帮帮我吗?我错过了什么?

附言。其他网站,例如stackoverflow.com使用上述httpc:request(...).

配置:我启动node.erl,节点在另一个模块启动httpfront.erl httpd守护进程,get请求在httpfront处理。我这样做了几次(启动更多节点),现在我想从一个带有 httpc:request(...) 的 httpfront 实例连接到另一个。所有的 HTTP 处理程序都在本地主机上启动,但不同的非专有端口。

节点.erl:

httpfront.erl:

正如我所说,现在最后我尝试从另一个节点调用它,但我得到了错误:

任何帮助和建议表示赞赏。谢谢你。

0 投票
2 回答
242 浏览

syntax - gen_server handle_info/2 澄清

在阅读 Erlang 和 OTP 的实际操作时,我遇到了一些奇怪的语法,这些语法与我难以理解的记录有关。我希望有人可以在这里澄清句柄信息中发生的超时情况:

具体来说,我不太确定这里发生了什么:

这似乎是某种反向分配?您是否有效地说第二个参数将是#state 记录,将 lsock 值分配给 LSock 变量并将整个记录分配给 State?我只是从接下来两行中变量的使用方式推断出这一点,但这种语法似乎很奇怪。

[编辑]

我在 shell 中对模式匹配和分配进行了更多测试,但它没有按我预期的那样工作:

然后我运行了这个测试函数,看看它是否只是在匹配函数参数: