У вас есть две простые альтернативы, используйте timer:send_interval/2
или erlang:send_after/3
. send_interval
проще в настройке, в то время как send_after
(при использовании в модуле Erlang) более надежен, поскольку является встроенной функцией, см. Руководство по эффективности .
Использование 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
вы можете отправить что-то с состоянием, если это необходимо, например, {trigger, Count}
или что-то еще.