问题标签 [erlang-otp]

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 回答
9252 浏览

callback - 初学者的 Erlang/OTP 行为

正如我从“Erlang and OTP in action”一书中了解到的那样,行为一词是指:

  • 行为接口,它是一组函数;
  • 行为实现,它是特定于应用程序的代码(回调模块);
  • 行为容器,它是一个过程。

问题:

Erlang/OTP 初学者应该了解哪些行为?是否可以概括地描述和理解 OTP 行为的概念?

在 Elang/OTP 的上下文中,“回调函数”实际上意味着什么?

我们可以将行为实现中的回调视为 Java 中重写的方法吗?

这本书说,以下代码中库函数“gen_server:start_link/4”的关联回调函数是“Module:init/1”。

这是否意味着使用 init/1 我们调用 gen_server:start_link/4 库函数?或者这意味着什么?

0 投票
3 回答
492 浏览

erlang - Erlang 中 gen_fsm:start/3 的唯一原子

我目前正在做一个游戏服务器的项目。每个玩家都应该有自己的带有 gen_fsm 行为的进程。要使用 start/3 启动 gen_fsm,我们需要一个唯一的 atom,目前我们使用 make_ref() 并找到了一种方法来将此 ref 变成具有 ref_to_list/1 的 atom。但根据这篇文章,不建议这样做,我同意他的看法。

你将如何解决这个问题?当我们使用本地选项启动 gen_fsm 时,我们需要一个原子来识别它。

0 投票
2 回答
189 浏览

erlang - 主管行为

在实施主管时..如果在主管模块中,我做类似的事情

init([_]) ->
{ok,
{{one_for_one, 5, 60},
[{reverese, {reverse, start_reverse, []}, Permanent, Brut_kill, worker,[]}]}}。

反向函数是:

start_reverse() ->
Pid=spawn(?MODULE,reverse,[])。

它不会起作用,因为 start_reverse 函数在每种情况下都会正常退出。但是,当我添加这样的一行时:

start_reverse() ->
Pid=spawn(?MODULE,reverse,[]),
{ok,Pid}。

即使函数正常退出,它也可以工作。有人可以解释为什么吗?

0 投票
2 回答
1505 浏览

erlang - Erlang:通过supervisor启动时gen_server崩溃

所以,我花了很多时间,仍然没有找到答案。

我在 gen_server 中有一个简单的 tcp 服务器,它通过 telnet 接受消息并在控制台中打印它们:

和主管:

我在 erlang 控制台中启动它:

得到这个:

这意味着,主管出于某种原因关闭了服务器。如果我自己启动服务器(st_server:start_link。)它工作得很好。

那么,问题是如何在不停机的情况下进行这项工作?

0 投票
2 回答
1865 浏览

erlang - 为什么在 Erlang 中使用 OTP?

正如问题所说:在使用 Erlang 开发时,使用 OTP 设计原则有什么好处?

我正在开发一个只接收命令并发送响应的服务器。

0 投票
3 回答
829 浏览

erlang - 如何使用 Nitrogen 作为 Erlang 应用程序的 GUI 前端?

我有一个基本的服务器端 Erlang 应用程序(还没有完全 OTP),我从命令行开始。我想把它变成一个交互式系统,使用浏览器作为带有 Nitrogen 的 GUI(版本 2.0.4)。总体计划是

  • 将当前模块变成 gen_server 作为 MODEL 部分;它分析数据并从中生成事件,这些事件反映了我感兴趣的数据的某些属性。
  • 添加一个 CONTROLLER 模块,它既是 gen_event(获取模型生成的事件)和 gen_server(允许来自 GUI 前端的查询)
  • 使用 Nitrogen 作为 VIEW,通过调用控制器模块(依次查询模型)使用 Ajax 工具更新相关页面

据我所知,我想要一个具有三个孩子的通用应用程序主管:模型、视图和控制器。然后他们将通过映射到 OTP 通信模式的 API 相互交谈。

这就是我卡住的地方:我应该把所有这些都放到 Nitrogen 目录树中吗?我是否应该设置一个新的应用程序目录结构并在其中包含三个组件(包括 Nitrogen)?作为我的应用程序主管的孩子,我究竟需要做什么来启动 Nitrogen 服务器(Nitrogen 启动脚本看起来比我预期的要复杂得多)?我已经开始学习Erlang 和 OTP in Action 了,但还没有完全完成。我需要在后天演示系统;)

我想要的是在命令行中输入“start.sh”,然后使用浏览器通过 Nitrogen 连接到应用程序。

0 投票
4 回答
6882 浏览

erlang - Erlang/OTP:同步与异步消息传递

Erlang 最开始吸引我的地方之一是 Actor 模型。不同进程同时运行并通过异步消息传递进行交互的想法。

我刚刚开始深入了解 OTP,尤其是查看 gen_server。我见过的所有示例 - 并且授予它们是教程类型的示例 - 使用handle_call()而不是handle_cast()实现模块行为。

我觉得这有点令人困惑。据我所知,handle_call这是一个同步操作:调用者被阻塞,直到被调用者完成并返回。这似乎与异步消息传递理念背道而驰。

我即将启动一个新的 OTP 应用程序。这似乎是一个基本的架构决策,所以我想在开始之前确保我理解。

我的问题是:

  1. 在实际实践中,人们倾向于使用handle_call而不是handle_cast?
  2. 如果是这样,当多个客户端可以调用同一个进程/模块时,对可扩展性的影响是什么?
0 投票
5 回答
4773 浏览

erlang - 在 init 中向 self() 发送消息是不是很糟糕?

示例中,作者通过执行以下操作避免了死锁情况:

self() ! {start_worker_supervisor, Sup, MFA}

在他的 gen_server 的 init 函数中。我在我的一个项目中做了类似的事情,并被告知这种方法不受欢迎,最好立即超时。接受的模式是什么?

0 投票
3 回答
244 浏览

erlang - 读取多次配置文件或使用 gen_server 状态?

我使用 gen_server 和 gen_fsm 实现了一个 otp 系统。对于软件运行所需的一些值,需要读取一个配置文件,例如:

我使用宏来提取其中一个值

问题如下:由于 ?VALUES 可能会被非常频繁地调用,因此配置文件会被解析多次,我是否应该将 ?VALUES 嵌入到我的 gen_fsm 的 gen_server 的状态中,并在需要时随时调用它来提取它?

事实上,我真的很欣赏之前的实现,因为只需更改配置文件中的值,就可以改变软件的行为,而无需任何 #state{} 更改或调用。

您更喜欢哪种解决方案?

0 投票
3 回答
1394 浏览

erlang - Erlang 消息可以发送哪些类型的消息?

主要是我想知道我是否可以在分布式 Erlang 设置中的消息中发送函数。

在机器 1 上:

在机器 2 上:

是否有意义?