我正在编写一个需要主动轮询一些远程资源的 Erlang 应用程序,我希望进行轮询的进程适合 OTP 监督树并支持所有标准设施,如正确终止、热代码重新加载等。
但是,gen_server
和gen_fsm
这两个默认行为似乎只支持基于回调的操作。我可以滥用 gen_server
通过调用 self 或滥用 gen_fsm
使单个状态始终以超时 0 循环到自身,但我不确定这是不是安全(即不会耗尽堆栈或在邮箱中累积未读邮件)。
我可以将我的流程变成 special process并自己编写所有处理程序,但这有效地让我重新实现了 Erlang 的轮子等价物。
那么这样的代码有行为吗?
loop(State) ->
do_stuff(State), % without waiting to be called
loop(NewState).
如果没有,是否有一种安全的方法来欺骗默认行为来执行此操作,而不会耗尽堆栈或随着时间的推移累积消息或其他什么?
最佳答案
在 Erlang 中执行此操作的标准方法是使用 erlang:send_after/3
。看这个SO answer还有这个example implementation .
关于erlang - 是否有一种 Erlang 行为可以自行行动而不是等待被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35442212/