问题标签 [gen-fsm]
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 - gen_fsm erlang 超时
我对 gen_fsm 超时有疑问。假设您有一组具有两种状态的 gen_fsm(将来可能会更多):idle
这是起始状态,而working
.
任何 5 秒 gen_fsm 都会检查一个特定的参数,并据此将保留idle
或移动到working
. 每当 gen_fsm 移动到 时,它都会向所有其他 gen_fsmworking
发送一条消息(使用):in 中的那些应该移动到,而 in 中的那个不应该关心传入的消息。gen_fsm:send_all_state_event/2
idle
working
working
现在,关键是我不想在状态超时中出现偏差(例如,如果机器在working
3 秒内并收到一条消息会发生什么?5 秒超时不再有效,因为我想保留无论如何都有固定的超时(这意味着应该在固定的时间触发超时消息)。
这是我的解决方案的重要部分,它使用now()
和time:now_diff/2
. 无论如何,我有一点偏差,但自从谈到几分之一秒后似乎很公平。
你认为它有效吗?
erlang - 如何将 gen_server/gen_fsm 从节点传输到节点
我想知道将 gen_server/gen_fsm 从 erlang 节点 A 移动到 erlang 节点 B 的建议方法(如果有)是什么,以保留其内部状态。
unit-testing - eunit 测试超时
如何测试 gen_fsm 是否确实与 eunit 超时?
erlang - 将 gen_fsm 状态更改为不同模块中的函数
我们有一个相当大的 USSD 应用程序,它使用 Erlang 的 gen_fsm 模块来管理菜单选项。
当前版本有一个menus_fsm.erl
包含 5000 多行 gen_fsm 相关代码的文件。我们的下一个版本让我们有机会将其拆分menus_fsm.erl
为单独的文件,以使其在未来更易于维护。
在旧版本中,为了显示帮助菜单,我们执行以下操作(help_menu/1
从显示主菜单的未显示代码中调用):
我遗漏了很多显示 FSM 入口点的代码等等。
在新版本中,我们希望将help_menu/1
和waitHelpMenuChoice/2
移至一个新模块help_menu
,该模块从 调用menus_fsm
,如下所示:
问题出在这行{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
:gen_fsm
期望waitHelpMenuChoice
在模块menus_fsm
中,这将我带回到我们开始的地方。
我试图用
但这只会导致如下错误:
{badarg,[{erlang,apply,[conv_fsm,#Fun<help_menu.waitHelpMenuChoice.2>,[]]}
有人对如何解决这个问题有任何建议吗?
erlang - 发送消息时确保 gen_fsm/gen_server 进程存在
在向其发送消息/事件之前,在 Erlang 中确保某个进程存在的最推荐方法是什么?在我的场景中,我在第一次出现消息时开始处理,然后它保持活动状态。在继续传递更多消息的同时,我首先尝试使用相同的名称启动进程以确保它已启动,如下所示(使用gen_fsm
和simple-one-for-one
重新启动场景):
我相信这个解决方案并不完美,可能会有一些开销,但仍然相信它比使用erlang:is_process_alive
. 我对吗?任何想法如何改进它?
erlang - 处理非法事件而不清除 gen_fsm 行为中的超时
Elrang Otp 系统文档gen_fsm
中有一个锁门示例。我有一个关于超时的问题。我先把代码复制到这里:
这里有一个问题:当门打开时,如果我按下按钮,状态gen_fsm
将有一个{button, Digit}
事件open
。将发生错误。但是如果我在打开函数之后添加这些代码:
然后如果我在 30 秒内按下按钮,则不会发生超时。门将永远打开。我应该怎么办?
谢谢。
更新:
我知道我可以使用send_event_after
或类似的东西。但我不认为这是一个好主意。因为您处理消息的例外状态可能会在复杂的应用程序中更改。
例如,如果我有一个功能,可以在 30 秒开门后手动锁门。然后locked
将处理timeout
消息,这不是例外行为。
scala - 我可以在 Akka FSM 代码中使用“发件人”吗?
假设我的初始状态是“Rule1”并且它不断在状态之间切换,如果它在“Rule1”中,它会移动到“Rule2”,反之亦然,基于某些条件它必须将消息发送回呼叫者(发件人)。
感谢你的帮助!
erlang - Erlang - 主管和 gen_fsm 上的异常退出
我有 3 个模块calculadora
:log_calculadora
和supervisor_calculadora
. Calculadora
只是一个简单的计算器,它使用 gen_fsm 进行求和、减法、乘法和除法,supervisor 实现了supervisor 行为。Calculadora 运行良好,但是当我尝试使用主管时,calculadora
当您进行除法 0/0 或异常时必须重新启动模块时,它不起作用。为什么?
PD:该模块log_calculadora
只是将我在calculadora
log.txt 文件中所做的操作写入。TEST 模块是给我异常退出的模块。
计算器:
导师:
测试模块
sockets - 将控制权从一个 gen_fsm 传递到另一个
我正在创建一个通用的 Erlang 服务器,它应该能够同时处理数百个客户端连接。为简单起见,假设服务器为每个客户端执行一些基本计算,例如客户端提供的每两个值的加法或减法。
作为起点,我将本教程用于基本的 TCP 客户端-服务器交互。代表监督树的摘录:
我想扩展此代码并允许tcp_echo_fsm
将对套接字的控制传递给两个模块之一:(tcp_echo_addition
计算每两个客户端值的加法),或tcp_echo_subtraction
(计算每两个客户端值之间的减法)。
将tcp_echo_fsm
根据来自客户端的第一条消息选择哪个模块来处理套接字,例如,如果客户端发送<<start_addition>>
,则它将控制权传递给tcp_echo_addition
。
上图变成:
我的问题是:
我在正确的道路上吗?我正在使用的教程是可扩展 TCP 服务器设计的良好起点吗?
如何将控制权从一个 gen_fsm(即
tcp_echo_fsm
)传递给另一个 gen_fsm(tcp_echo_addition
或tcp_echo_subtraction
)?或者更好:这是设计服务器的正确/干净的方式吗?这个相关问题表明,在 gen_fsm 和另一个模块之间传递控制权并非易事,这种方法可能有问题。
erlang - 在这种情况下我应该使用哪种 Erlang 行为,即 gen_server 或 gen_fsm
我正在开发一种解决方案,用于查询特定事务的 SOAP Web 服务。一旦检索到,这些事务将被保存在数据库中,然后调用回调 url 将一些数据发送到另一台服务器。您将如何最好地设计解决此问题的方案。我的困惑是是否应该使用 gen_server 或 gen_fsm ,如果是,解决方案的哪个组件去哪里,即如果 gen_server 什么任务去服务器哪个任务去客户端。