gpt4 book ai didi

timer - 如何在 Elixir 或 Erlang 中使用 GenServer 实现可重置的倒数计时器

转载 作者:行者123 更新时间:2023-12-04 13:16:01 24 4
gpt4 key购买 nike

我们如何使用 GenServer 实现可重置的倒数计时器?

1)在固定时间后执行任务,比如每 60 秒

2) 有办法在计时器结束前将倒计时重置回 60 秒

我看过How to perform actions periodically with Erlang's gen_server?但它并没有完全涵盖在倒计时结束之前让计时器休息的方面。

谢谢。

最佳答案

How can I schedule code to run every few hours in Elixir or Phoenix framework?定义如何做一个周期性的工作。
要使用它作为基础实现取消,您可以执行以下操作:

defmodule MyApp.Periodically do
use GenServer

def start_link(_name \\ nil) do
GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
end

def reset_timer() do
GenServer.call(__MODULE__, :reset_timer)
end

def init(state) do
timer = Process.send_after(self(), :work, 60_000)
{:ok, %{timer: timer}}
end

def handle_call(:reset_timer, _from, %{timer: timer}) do
:timer.cancel(timer)
timer = Process.send_after(self(), :work, 60_000)
{:reply, :ok, %{timer: timer}}
end

def handle_info(:work, state) do
# Do the work you desire here

# Start the timer again
timer = Process.send_after(self(), :work,60_000)

{:noreply, %{timer: timer}}
end

# So that unhanded messages don't error
def handle_info(_, state) do
{:ok, state}
end
end
这维护了对计时器的引用,允许它被取消。每次 :work收到消息后,会创建一个新的计时器并将其存储在 GenServer 的状态中。

关于timer - 如何在 Elixir 或 Erlang 中使用 GenServer 实现可重置的倒数计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com