首页 > 解决方案 > 在应用程序启动时填充 ETS 表

问题描述

我正在尝试创建一个 elixir/erlangets表并在应用程序启动时使用一些数据填充它。我看到它在启动时运行,但可能是编译/运行时错误?

例如:

def start(_type, _args) do
  import Supervisor.Spec

  # Define workers and child supervisors to be supervised
  children = [
    DataToETS,
  ]

  opts = [strategy: :one_for_one, name: App.Supervisor]
  Supervisor.start_link(children, opts)
end

然后是DataToETS

defmodule DataToETS do
  use Task

  def start_link(opts) do
    Task.start_link(DataToETS, :run, [])
  end

  def run do
    # Load to the ETS  
  end

end

在我的DataToETS我做日志并记录。知道如何在应用程序运行时填充然后访问吗?

标签: erlangelixirets

解决方案


如果您只是想创建一个表并填充一次(不附加到另一个子流程,如GenServer),您可以直接在start/2应用程序的回调中执行此操作:

def start(_type, _args) do
   # Create ETS Table here
   # and seed it with initial data

   # Other stuff...
end

如果您想在子流程启动时专门执行此操作,您可以在它的init/1回调中创建/填充它。这就是 GenServer 的样子:

defmodule DataToETS do
  def start_link(_args) do
    GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
  end

  def init(:ok) do
    # Create ETS Table here
    # and seed it with initial data
    :ok
  end
end

其他进程(如 Supervisor、Task、GenStage 等)也是如此……


推荐阅读