如何使用Erlang的gen_server定期执行操作?

我想启动一个gen_server另外,将执行一个动作每分钟。

什么是最好的方法来安排?

你有两个简单的选择,使用定时器:send_interval / 2或erlang:send_after / 3。 send_interval更容易设置,而send_after(在Erlang模块中使用时)更可靠,因为它是一个内置函数,参见Efficiency Guide

使用send_after还可以确保gen_server进程不会重载。如果你使用send_interval函数,你会得到一个消息,无论该进程是否能跟上。由于send_after在handle_info中的返回之前被调用,所以只有在处理了前一个消息后才调度新消息。如果你想要更准确的时间跟踪,你仍然可以安排一个send_after时间动态设置为低于INTERVAL(或甚至0)的时间来追赶。

我会推荐你​​的gen_server中的以下几行:

-define(INTERVAL, 60000). % One minute

init(Args) ->
   ... % Start first timer
   erlang:send_after(?INTERVAL, self(), trigger),
   ...

handle_info(trigger, State) ->
   ... % Do the action
   ... % Start new timer
   erlang:send_after(?INTERVAL, self(), trigger),
   ...

而不是触发器,你可以发送一个带有状态的东西,如果需要的话,比如{trigger,Count}或者东西。

http://stackoverflow.com/questions/5883741/how-to-perform-actions-periodically-with-erlangs-gen-server

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何使用Erlang的gen_server定期执行操作?