erlang - 是否有一种 Erlang 行为可以自行行动而不是等待被调用?

标签 erlang behavior tail-recursion erlang-otp

我正在编写一个需要主动轮询一些远程资源的 Erlang 应用程序,我希望进行轮询的进程适合 OTP 监督树并支持所有标准设施,如正确终止、热代码重新加载等。

但是,gen_servergen_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/

相关文章:

erlang 中的字符串值

erlang - 如何将整数列表连接到 Erlang 中的字符串?

Vim Split 和 VSplit 行为

c - 递归、尾递归和迭代

recursion - Clojure,对向量列表求和,沿途记录位置

c - Erlang和C语言混合编程用C高比例可以吗?

wcf - 指定每个端点的 CasSTLe WCF 集成工具端点行为

CSS:不包括行为

c++ - 循环递归函数c++

windows - ejabberd模块编译错误