Elixir 中的后台进程
Background processes in Elixir
我有一个网站,我必须在其中创建多个后台进程。
每个进程将最多存活 20-30 分钟,并且它不会进行任何计算,而只是每分钟检查一次某个应用程序的状态,并向其传递特定的参数列表。而已。据说每小时我会创建 5 个这样的任务。
这些进程不必相互通信。
如何在 Elixir 中更好地组织所有这些?通过任务?或者有更好的方法吗?
要制作这样一个简单的调度程序,您可以将 Process.send_after
与 GenServer 的 handle_info
结合使用,因为从上面的函数发送的消息是作为信息处理的。
例如
defmodule YourGenServer do
use GenServer
def init(initial_value) do
Process.send_after(self, :check_state, 1000 * 60 * 20) # 20 minutes delay
end
def handle_info(:check_state, state) do
# do the task
Process.send_after(self, :check_state, 1000 * 60 * 20)
end
end
有什么更好的解决方案?任务和代理也是 GenServers,只是它们的 API 更简单。我在示例 GenServer 中使用它来向您展示它的外观。对你来说最好的想法可能是使用包装器,它在引擎盖下封装了服务器的回调,如果你想改变引擎,你只需顺利地进行。
我有一个网站,我必须在其中创建多个后台进程。 每个进程将最多存活 20-30 分钟,并且它不会进行任何计算,而只是每分钟检查一次某个应用程序的状态,并向其传递特定的参数列表。而已。据说每小时我会创建 5 个这样的任务。
这些进程不必相互通信。
如何在 Elixir 中更好地组织所有这些?通过任务?或者有更好的方法吗?
要制作这样一个简单的调度程序,您可以将 Process.send_after
与 GenServer 的 handle_info
结合使用,因为从上面的函数发送的消息是作为信息处理的。
例如
defmodule YourGenServer do
use GenServer
def init(initial_value) do
Process.send_after(self, :check_state, 1000 * 60 * 20) # 20 minutes delay
end
def handle_info(:check_state, state) do
# do the task
Process.send_after(self, :check_state, 1000 * 60 * 20)
end
end
有什么更好的解决方案?任务和代理也是 GenServers,只是它们的 API 更简单。我在示例 GenServer 中使用它来向您展示它的外观。对你来说最好的想法可能是使用包装器,它在引擎盖下封装了服务器的回调,如果你想改变引擎,你只需顺利地进行。