问题标签 [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.
erlang - 为什么 Erlang 的终止原因是正常的?
全部
日志部分:
为什么在正常的情况下会报错误日志?谢谢你的帮助~~~
erlang - 为 gen_server 添加了主管,立即关闭?
编辑:下面。
为什么我的受监督的 gen_server 这么快就关闭了?
我将给出这些组织名称以更清楚地说明我希望在我的应用程序中使用的命令链:首先我从“assembly_line_worker”开始,然后将“marketing_specialist”添加到我的监督树中......
ceo_supervisor.erl
assembly_line_worker_supervisor.erl
装配线工人.erl
正在发生的事情是装配线工人做了一些工作,比如在调用 ceo_supervisor:start_link(#innovative_ideas{}) 命令后接收到几条消息,然后它就关闭了。知道为什么吗?我知道 gen_server 正在接收一些消息,因为它 io:format 将它们发送到控制台。
谢谢!
编辑:我通过 erlsrv.exe 在 Windows 上托管它,我发现当我通过如下函数启动程序时:
...此功能立即退出会导致我的主管/gen_servers 关闭。我希望这是因为所有这些都通过监督链接到原始调用过程,所以当它退出时,孩子们也应该这样做。
所以我想一个更好的问题是,我怎样才能让我的主管在完成所有启动配置后继续运行?除了将所有这些包装在应用程序中之外,还有其他选择吗?(听起来还不错……)
感谢您的探索性问题!我通过这种方式了解了更多关于主管的信息。
蝙蝠侠
erlang - 如果我删除了 gen_server 模块的进程字典会怎样?
我正在使用 gen_server 模块中的进程字典,我调用了 get() 函数,我得到了类似的东西。
如果我删除进程字典会发生什么,会出现什么问题?
我删除了它,一切正常,即使调用在 child_server 中生成异常的函数 main_server 仍然可以获得退出信号。
sockets - erlang 套接字和 gen_server - 服务器端没有收到数据
简而言之: 我正在尝试制作一个客户端连接并发送/接收消息的套接字服务器(基于 Learn you some erlang tutorial http://learnyousomeerlang.com/buckets-of-sockets中的 sockserv 代码)服务器端组件: supervisor - 独特的,从一开始就开始,产生具有 gen_server 行为的进程 gen_server 行为进程 - 每个处理一个连接。
客户端:客户端连接到套接字并发送几个字节的数据然后断开连接。
代码详细信息 我的代码与本教程中的代码几乎相同。主管是相同的。gen_server 组件被简化,因此它只有一个 handle_info 案例,它应该捕获所有内容并打印它。
问题 连接成功,但是当客户端发送数据时,服务器表现得好像没有接收到数据(我希望在发生这种情况时调用handle_info)。
handle_info 确实被调用,但仅在客户端断开连接并且此事件与消息一起报告时。
我尝试 过使用 Erlang 或 Java 编写的不同客户端,我尝试过设置套接字的主动/被动状态。教程作者在发送消息后设置{active, once}。在这样创建 AcceptSocket 之后,我最终只是设置了 {active, true} :(gen_server proc 初始化为包含由主管创建的原始 ListenSocket 的状态)
它绝对没有效果。handle_info 仅在连接丢失时被调用,因为客户端断开连接。每当客户端发送数据时,什么都不会发生。
可能是什么问题呢?我花了很长时间在这上面,我真的不知道。非常感谢。
erlang - 如何获得 Erlang 的光束大小?
我有一个需要优化的遗留 Erlang 程序。这段代码在运行时最多使用 20G 内存。我想知道是否有办法在运行时获取进程本身的 Erlang Beam 大小?如果这是可能的,那么我可以做一些事情,比如如果光束大小>10GB,然后拒绝所有对 gen_server 进程的调用。谢谢您的帮助!
erlang - 如何更改 erlang 中 gen_server 的回调模块?(gen_server:swap_handler)
我正在构建一个可以以两种模式运行的应用程序。沙盒模式和生产模式。
在沙盒模式下,我想在我的 gen_server 中对数据库进行许多检查:如果表不存在,则创建它;如果列不存在,则添加它;如果列类型不允许我要存储的值然后更改它,等等。
在生产模式下,如果表不存在或列与值的类型不匹配,则会失败,没关系。
因此,为了避免像“case State#state.is_sandbox of true -> ...”这样的繁琐代码,我想为我的 gen_server 设置两个不同的模块,并且我想在 handle_call 或句柄信息。
实际上,我只是想从沙盒转到生产,但我认为如果它以这种方式工作,它可以向后工作。
谢谢。
erlang - Erlang Supervisor 无法 start_child 且没有错误 simple_one_for_one
主管似乎无法默默地启动孩子......
这里是监督
和gen_server
gen_server 的 start_link/1 显然从未被调用(使用 io:fwrite 检查)。
似乎无法找出原因...
erlang - 如何处理通过 Erlang gen_server 打开的文件?
我创建了一个模块,它以完全不同的方式透明地处理某些文件,作为 Erlangfile:open/2
和它返回的 IoDevice/文件描述符的替代品。在许多情况下,它只是简单地返回 Erlang 的结果file:open/2
,而在其他情况下,它返回一个通过 HTTP API(CloudFiles 或 AWS S3)读写的自定义 IoDevice。
最近这是一个普通的模块,但我一直在尝试将其转换gen_server
为更好地处理异步 HTTP 调用(以及其他原因)。这些自定义位运行良好,但我无法简单地file:open/2
从 a调用gen_server:handle_call/3
并返回生成的 IoDevice。问题是在我gen_server
打开文件以使用 IoDevice 回复后,gen_server:handle_info/2
我的gen_server
.
我认为这与文档中的以下内容有关:
IoDevice 实际上是处理文件的进程的 pid。此进程链接到最初打开文件的进程。如果与 IoDevice 链接的任何进程终止,则文件将被关闭并且进程本身将被终止。从此调用返回的 IoDevice 可用作 IO 函数的参数(请参阅 io(3))。
有没有办法从 a 打开文件gen_server
,将其 IoDevice 交给另一个进程?
erlang - Erlang: supervisor:start_child/2 错误让我很困惑
我正在对 Logan/Merritt/Carlson 的简单缓存、第 6 章、第 149-169 页、Erlang 和 OTP in Action 进行轻微修改。到目前为止,没有代码更改,只是重命名模块。
我启动应用程序:
我插入一个项目:
我收到此错误:
这是代码:
我看第 15 行:
我预计会出现错误,因为这是一个新项目。gridz:edit 是一个 gen_server(Logan 等人中的 sc_element。)这是 create/1 的代码:
这是 gridz_sup:start_child/2 的代码:
如果我直接执行 supervisor:start_child/2 ,这就是我得到的:
gridz_edit 中的第 51 行是一个 init 函数:
如果我直接执行它,它可以工作:
所以现在我很困惑。我错过了什么?为什么 supervisor:start_child/2 会抛出错误?
谢谢,
LRP
linux - Erlang gen_server 进程在不陷阱退出时不退出
伙计们,
我有一个关于 Erlang gen_server 的问题。
代码片段在这里:
文件:akita_cluster_info.erl
文件:akita_collector_local.erl
shell 的输出是这样的:
不要陷阱退出:
Eshell V5.9.1(使用 ^G 中止)
(akita@hao)1> akita_cluster_info:start_link()。
dic: [{'$ancestors',[<0.50.0>]},{'$initial_call',{akita_collector_local,init,1}}]
接收信息:{init_dets,{akita@hao,ok}}
{ok, <0.48.0>}
(秋田@hao)2>
陷阱出口:
Eshell V5.9.1(使用 ^G 中止)
(akita@hao)1> akita_cluster_info:start_link()。
dic: [{'$ancestors',[<0.50.0>]},{'$initial_call',{akita_collector_local,init,1}}] 终止原因:正常
接收信息:{init_dets,{akita@hao,ok }}
接收信息:{collector_close,{akita@hao,normal}}
{ok,<0.48.0>}
(akita@hao)2>
如果process_flag(trap_exit, true)
没有注释,则akita_collector_local gen_server 进程将立即退出,因为它的父进程(在 rpc:multicall 中生成)死亡。我知道这很正常。
奇怪的是,没有process_flag(trap_exit, true)
的时候,akita_collector_local gen_server 进程还能存活!!既然不能trap exit,它应该马上就退出了。(这个理论是正确的,我在 Erlang shell 中测试过)。但是为什么在这种情况下 gen_server 进程不退出。我不知道。
你能帮助我吗?非常感谢。
阮
兄
ps:我认为棘手的部分可能在于rpc:multicall