问题标签 [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.
timer - erlang计时器超时
我有一个带有行为 gen_server 的 erlang 模块。
我现在有:
和
当我{ok, Test}=gen_server:start_link({local,challenge_manager},challenge_manager,[],[]).
在几秒钟后开始它时,我得到了** exception error: {timeout,{gen_server,call,[<0.329.0>,{updateLvls}]}}
难道我做错了什么??
erlang - 如何将 gen_server/gen_fsm 从节点传输到节点
我想知道将 gen_server/gen_fsm 从 erlang 节点 A 移动到 erlang 节点 B 的建议方法(如果有)是什么,以保留其内部状态。
error-handling - 设置 gen_server 类型应用程序的状态
我试图找出是否可以启动具有给定状态的 gen_server。
我希望能够设置一个监视器/主管,当此服务器崩溃时,它会以其最后一个有效状态重新启动服务器。
任何关于如何解决这个问题的建议都将非常受欢迎。
到目前为止,我唯一的想法是有一个特殊的 handle_call/3 在调用时将服务器状态更改为所需的状态,但我想避免修改服务器模块并尽可能从我的监视器/主管进程中处理这个。
感谢您的时间。
erlang - 监控 gen_server
我一直在尝试使用 erlang:monitor/2 监控 gen_server。不幸的是,每次我尝试这个时,Erlang shell 都会进入一个无限循环。
这是我为测试它而编写的测试程序。
当我使用上面的代码来监控类似 spawn(fun() -> ok end) (通过将第 6 行和第 7 行更改为 erlang:monitor(spawn(fun() -> ok end)) 之类的东西时,上面的代码可以作为故意的。
有人可以告诉我我做错了什么吗?是否只能通过主管监控 gen_server 进程?
谢谢
ssl - Erlang + Apple 推送通知 [无效令牌问题]
我目前正在尝试为 Erlang 创建一个推送通知模块。
当令牌有效时,一切正常......问题是旧设备令牌(现在无效)被拒绝。我知道 apns 将使用 6 字节套接字消息拒绝无效令牌,并使连接无效(我认为这真的很愚蠢,无论如何......)
问题是我似乎没有收到 APNS 应该给我的模块的 6 字节套接字消息,就像控制进程没有监听套接字一样。
这是我的代码:
因此,当我启动模块并推送到有效令牌时,手机会收到推送,但是当我推送到无效令牌,然后推送到有效令牌时,有效令牌将不会收到任何推送.. .
我知道我应该听取反馈服务以便从我的数据库中删除设备令牌,但我还需要知道推送网关是否使我的连接无效以便重新连接。
所以这是真正的问题:为什么我的 gen-server 没有收到错误响应数据包(应该与 handle_info({ssl, Socket, Data}, P) 匹配)?
erlang - Erlang 主管。重启进程,如果多次失败,放弃并发送消息
我有几个gen_server
工人定期从硬件传感器请求一些信息。传感器可能会暂时失效,这是正常的。如果传感器失败,工作人员会因异常而终止。
所有工人都是从具有simple_one_to_one
策略的主管中产生的。我还有一个控件gen_server
,它可以启动和停止工作人员,还可以接收'DOWN'
消息。
所以现在我有两个问题:
如果工作人员由主管重新启动,则其状态将丢失,这对我来说是不可接受的。我需要重新创建具有相同状态的工人。
如果工人在一段时间内多次失败,则传感器发生了严重的事情,需要操作员注意。因此我需要放弃重新启动工作程序并向事件处理程序发送消息。但是主管的默认行为是在耗尽进程重启限制后终止。
我看到两个解决方案:
将supervisor中的进程类型设置为临时并控制它们并在控制中重新启动它们
gen_server
。但这正是主管应该做的,所以我在重新发明轮子。为主要主管下的每个工人创建一个主管。这正好解决了我的第二个问题,但是重启后worker的状态会丢失,因此我需要一些像ets table这样的存储来存储worker的状态。
我对 Erlang 很陌生,所以我需要一些关于我的问题的建议,关于哪种(如果有的话)解决方案是最好的。提前致谢。
erlang - 如果handle_call 函数中有“record = State”会发生什么?
gen_server 中的 handle_call 函数是:
但是我遇到了一个这样的handle_call函数:</p>
我想知道发生了什么?它在我头顶
顺便说一句:yuv 记录是:
sockets - Erlang Tip&Tricks 减少 gen_server ssl 套接字的内存占用
有没有人知道如何减少面向 Erlang gen_server ssl 套接字的内存占用?
现在每个客户端(gen_server)在内存中都有一个类似 128 Ko 的东西。而在 C++ 中,我有更多的东西,比如每个客户端 40 Ko。
喜欢:
- 更改 ssl 密码会改变内存占用吗?
- 改变缓冲区大小?
我真的在寻找任何可以大大减少内存占用的想法!
编辑 1:我已经在使用 hibernate_after 选项。
erlang - 为什么 erlang io:format 输出丢失,我需要做什么来恢复它?
我正在编写一个 gen_server,我们将称之为 gen_server_db,它并没有什么特别之处。它使用的库 (emysql) 有可能在尝试查找数据库服务器时遇到连接失败(在 gen_server_db:init() 中)。当我捕捉到异常并尝试将某些内容打印到控制台时,我得到了 zip。在下面的代码示例中,两个 io:format 消息都无法到达控制台。我似乎记得很久以前听到过这个的原因,但我不记得为什么。
erlang - 在使用 key-to-pid 机制时处理临时 gen_servers 状态的保存
我想知道当它们与密钥相关联时如何处理临时 gen_servers 状态的保存。
要将键与进程关联,我使用了一个名为 pidstore 的进程。Pidstore 最终启动进程。我给 pidstore 一个 Key 和一个 M,F,A,它在全局中查找密钥,然后如果找到则返回 pid 或应用 MFA(必须返回 {ok, Pid}),用密钥注册 Pid全局并返回 Pid。
我可能有许多不活动的 gen_servers,它们的状态可能很大。因此,我设置了 handle_info 回调以将状态保存在我的数据库中,然后停止该过程。gen_servers 在他们的主管中被认为是暂时的,所以它们不会重新启动,直到有东西再次需要它们。
问题从这里开始:如果我在代表 {car, 23} 的进程中的 handle_info 的保存步骤期间用它的键调用一个进程,比如 {car, 23},我会按预期取回 pid,因为过程正在保存且未完成。所以我会用 gen_server:call 调用我的进程,但我永远不会有响应(并达到默认的 5 秒超时),因为进程正在停止。(问题一)
为了解决这个问题,进程可以从全局注销自己,然后保存它的状态,然后停止。但是,如果我在注销后但在保存完成之前需要它,我将加载一个新进程,该进程可能会在数据库中加载未更新的值。(问题 B)
为了再次解决这个问题,我可以确保数据库中的加载和保存被排队并且不能并发。这可能是一个瓶颈。(问题 C)
我正在考虑另一种解决方案:我的进程在保存之前可以告诉 pidstore 他们很忙。pidstore 将保留一个繁忙进程的列表,并对这些键的任何需求做出“忙碌”响应。保存完成后,进程将告诉 pidstore no_more_busy 并在询问密钥时启动新进程。(即使旧的过程没有完成,它已经完成保存,所以它可以花时间独自死去)。
这对我来说似乎有点混乱,但是尝试多次从密钥中获取 Pid 感觉更简单,而不是包装对 gen_server 的每次调用以处理可能的超时。(当流程完成但仍在全球注册时)。
我对所有这些半问题和半解决方案有点困惑。您在这种情况下使用的设计是什么,或者我该如何避免这种情况?
我希望我的信息清晰易读,也请告诉我英文错误。
谢谢你