【问题标题】:Function called automatically after a given time in erlang在erlang中给定时间后自动调用的函数
【发布时间】:2019-10-31 23:45:30
【问题描述】:

Erlang 中是否有任何函数在给定时间后自动被调用,一旦触发它应该在给定时间后自动调用,应该不需要触发它一次又一次。我正在用 Erlang 编写一个模块,它在 ejabberd server 上执行清理任务。该模块一旦触发,需要每天自动调用。有什么指点吗?

【问题讨论】:

    标签: erlang ejabberd


    【解决方案1】:

    timer提供了几个功能:

    • apply_after, send_after 允许在一定时间后执行函数或发送消息,

    • apply_interval, send_interval 允许定期执行功能或发送消息。

    结合 apply_after 和 apply_interval 或发送间隔,您应该能够做您想做的事。

    【讨论】:

      【解决方案2】:

      timer:apply_after/4

      例子:

      -module(my_module).
      -export([foo/1]).
      
      foo(Text) ->
          error_logger:info_msg(Text, []).
      

      10000 毫秒后调用 foo:

      timer:apply_after(10000, my_module, foo, ["Hello!"]).
      

      【讨论】:

        【解决方案3】:

        您可以使用erlang:send_aftererlang:start_timer 来执行功能或执行其他操作。同时,你可以使用timer:apply_after,但可能会导致CPU使用率很高,因为定时器是一个单独的进程来管理定时器。使用erlang:send_after/3erlang:start_timer/3 创建定时器比使用定时器模块提供的定时器要高效得多。

        【讨论】:

        • 请解释为什么 timer:apply_after 会占用大量 CPU。我认为 timer 的问题是如果你经常使用 timer,它可能会成为一个瓶颈,因为它是一个单例。
        • @mattias 你是对的。定时器是一个单例,用户的每一个定时器都是一条记录,存储在ets表“timer_tab”中。所以当用户使用定时器过多时,就会成为一个瓶颈。 ps:我英文不太好,所以句子可能不太流利。
        • 所以在这种情况下,他可能只有一个“ejabberd 服务器上的清理任务。”,它只会在 ets 表中占用一个条目,所以这不是问题。但是,如果你启动数千个或更多apply_after,那会是个问题吗?
        猜你喜欢
        • 2012-09-28
        • 1970-01-01
        • 2013-02-26
        • 2020-06-17
        • 2023-03-23
        • 2010-11-21
        • 2012-07-16
        • 2023-04-03
        相关资源
        最近更新 更多