问题标签 [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.
erlang - Erlang应用问题
我尝试将应用程序写入我的 Erlang 程序。
我有 test_app.erl:
和 .app 文件:
当我尝试启动应用程序时:
我得到错误:
怎么了?我该如何解决?
如果我在 eshell 中制作:
比所有的作品。
谢谢你。
erlang - 处理 gen_server 状态的清理
我有一个gen_server
运行,它必须在正常停止或意外崩溃时清理其状态。清理基本上包括删除一些文件。
此时,当gen_server
崩溃或正常停止时,清理完成terminate/2
。
如果崩溃,有什么理由terminate/2
不会被调用?gen_server
如果意外死亡,是否应该有任何其他进程监视gen_server
等待进行清理的过程?gen_server
所以,代码是这样的:
编辑:我在官方邮件列表中发现了这封电子邮件,它谈论的是同一件事:
http://groups.google.com/group/erlang-programming/browse_thread/thread/9a1ba2d974775ce8
正如亚当在下面所说,如果我们想避免将存在困在 中gen_server
,我们可以使用不同的方法。
但是如果我们捕获存在,terminate/2
似乎是一个安全的地方进行清理,因为它总是会被调用。此外,我们必须正确处理何时'EXIT'
发送到terminate/2
并handle_call/3
尝试在工人和主管之间正确传播错误。
erlang - Erlang HTTP 客户端:inets 或 ibrowse 或 ...?
我正在使用 Erlang,需要发出高效的 HTTP 请求。
Erlang/OTP 当前的“标准”HTTP 客户端是什么?
它是 inets 还是 ibrowse 或完全是其他东西?
任何建议或指示表示赞赏。
architecture - Erlang OTP 应用程序设计
当我将一些代码转换为 OTP 应用程序时,我正在努力掌握 OTP 开发模型。
我本质上是在制作一个网络爬虫,但我只是不太清楚将执行实际工作的代码放在哪里。
我有一个主管来启动我的工人:
在这个设计中,Crawler Worker 负责做实际的工作:
do_crawl产生了相当多的进程和请求来处理通过 http 进行的爬取工作。
最终的问题是:实际的抓取应该在哪里发生?从上面可以看出,我一直在尝试不同的方式来触发实际工作,但仍然缺少一些对于探索事物组合方式必不可少的概念。
注意:为简洁起见,省略了一些 OTP 管道 - 管道都在那里,系统都挂在一起
erlang - 如何在动态主管中自动删除终止子项的规范
这个问题不需要USB知识,只是将其描述为使示例更加具体。
我正在尝试为 USB 总线上的特定设备实现动态管理器。这些设备具有地址,并在系统的生命周期内出现和消失。
对于每个设备,我的主管都需要一个动态的孩子。
这些孩子是暂时的,所以一旦它们崩溃或终止,我们就不会重新启动它们(因为那时它们可能已经消失了)。
我有一个进程在特定时间扫描 USB 端口并生成我要处理的 USB 设备的所有地址的列表。
我计划supervisor:which_children/1
在每次扫描之前调用以找出哪些设备存在但没有运行子进程。
为了找出哪些地址有孩子在运行,我计划为包含地址的 childspec 创建 Id 原子(只有几个地址可能),例如, adr_12
如果孩子处理 address 12
。
当我尝试启动/重新启动丢失的孩子时,我遇到了一些丑陋的情况,即当临时孩子终止或崩溃时,孩子规范不会自动删除(至少我认为是这样)。所以我需要这样的代码:
然后是我不知道是否supervisor:which_children/1
也返回已经终止的孩子的问题。
因此,最好在子节点暂时终止后将其删除。
不知何故,这一切对我来说都是不雅的,所以我问自己(和你):
我怎样才能最优雅地解决这个问题?
在这种情况下完全不使用主管会更好吗?
erlang - 在 SUSE 上安装 Erlang
有人知道如何在 openSUSE 11.4(或类似版本)上安装 Erlang 吗?
erlang - 重新启动孩子时主管会阻止呼叫吗?
我试图了解这里发生了什么:
我有一个主管在不触发MaxR, MaxT
机制的情况下循环重启一个客户端。客户端只是缓慢地崩溃,永远不会触发速率限制。
将有另一种机制使用supervisor:which_children/1
并delete_child/2, start_child/2
调整子集以适应现实(它扫描 USB 设备,试图让每个设备找到一个监督子)。
这通常表现为速率限制的安全网,但奇怪的是,它看起来根本没有调用删除和启动子项的机制。
为了找出发生了什么,我supervisor:which_children/1
从 shell 调用,看起来调用只是阻塞并且永远不会返回。
是否会在它忙于尝试重新启动孩子时阻止对主管的呼叫?
附录:
看起来崩溃发生在子启动期间:
erlang - 达到_max_restart_intensity 的主管如何只删除有问题的孩子?
我有一个one_for_one
主管,负责处理类似且完全独立的孩子。
当一个孩子出现问题时,反复崩溃和触发:
关闭自己并终止所有无辜的孩子,否则这些孩子会继续正常运行。
如何从标准 Erlang 监督者中构建监督树,只停止重新启动一个有问题的孩子而让其他孩子独自一人?
我正在考虑增加一个只带一个孩子的主管,但这对我来说似乎很重要。
还有其他方法来处理这个吗?
erlang - 在 Erlang 集群中的所有节点上运行 gen_server 的最佳方法是什么?
我正在Erlang 中构建一个监控工具。在集群上运行时,它应该在所有节点上运行一组数据收集功能,并使用 RRD 在单个“记录器”节点上记录该数据。
当前版本在主节点 ( rolf_node_sup
) 上运行一个主管,它尝试在集群中的每个节点 ( ) 上运行第二个主管rolf_service_sup
。然后,每个节点上的监督者应该启动并监视一堆进程,这些进程将消息发送回主节点上的 gen_server ( rolf_recorder
)。
这仅在本地有效。没有在任何远程节点上启动主管。我使用以下代码尝试从记录器节点加载节点上的主管:
我发现有几个人建议主管真的只为本地流程设计。例如
实现我要求在集群中的所有节点上运行监督代码的最 OTP 方式是什么?
- 建议将分布式应用程序作为分布式主管树的一种替代方案。这些不适合我的用例。它们提供节点之间的故障转移,但保持代码在一组节点上运行。
- 池模块很有趣。但是,它允许在当前负载最少的节点上运行作业,而不是在所有节点上运行。
- 或者,我可以在主节点上创建一组受监督的“代理”进程(每个节点一个),用于
proc_lib:spawn_link
在每个节点上启动一个监督者。如果节点上出现问题,代理进程应该死掉,然后由它的主管重新启动,这反过来又应该重新启动远程进程。从模块在这里可能非常有用。 - 或者,也许我过于复杂了。直接监督节点是一个坏主意,相反,也许我应该构建应用程序以更松散耦合的方式收集数据。通过在多个节点上运行应用程序来构建一个集群,告诉一个成为主节点,就这样吧!
一些要求:
- 该架构应该能够处理节点加入和离开池而无需人工干预。
- 为了简单起见,我想构建一个单主解决方案,至少最初是这样。
- 在我的实现中,我更愿意使用现有的 OTP 工具而不是手动代码。
erlang - Erlang 消息队列是否跨进程持久化?
这应该是一个简单的问题,但我对文档的了解不足以找到答案。
如果 OTP 主管在崩溃后重新启动 gen_server,新的子进程会继承崩溃进程的消息队列,还是在崩溃前发送但尚未被旧子进程处理的消息掉在地上?