在应用程序启动时填充 ETS table

Populate ETS table on application start

我正在尝试创建一个 elixir/erlang ets table 并在应用程序启动时用一些数据填充它。我看到启动时是运行,但可能是compile/runtime错误?

例如:

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 中,我记录并记录。知道如何在应用程序 运行s 时填充然后访问吗?

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

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

   # Other stuff...
end

如果您想在子进程启动时专门执行此操作, 您可以在 init/1 回调中 create/populate 它。这就是 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 等)也类似...