【问题标题】:Populate ETS table on application start在应用程序启动时填充 ETS 表
【发布时间】:2019-03-22 17:38:46
【问题描述】:

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

例如:

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

【问题讨论】:

  • 您是否尝试过创建表,然后将其填充到DataToETSinit 回调中?这就是要走的路。
  • 使用start_link函数会怎样?
  • 我知道这如何与 GenServer 一起工作。但这是导致它的运行时/编译时间差异吗?
  • 这将在运行时工作,但在应用程序启动时。如果您发布您的 DataToETS 实现,我将能够更好地帮助您。
  • @Sheharyar 谢谢我已经进行了更新以包括DataToETS。我知道加载正在工作我可以在 iex 中运行它并加载。刚开始。谢谢。

标签: erlang elixir ets


【解决方案1】:

如果你只是想创建一个表并填充一次(不附加到另一个子流程,如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 等其他进程来说也是类似的......

【讨论】:

  • 好的,这确实有道理,谢谢。我仍然不确定为什么它可以在开始时在此处加载表格,但不能在像 run 这样的另一个函数中工作。
  • @PeteJ 都是关于 erlang 进程的。 ETS 由进程拥有。回调(如start/2init/1 属于this 进程,而run/0 和其他只是由caller 进程执行的函数。您应该明确地pass a table identifier returned by new到另一个进程,使其从那里可用。
猜你喜欢
  • 2018-02-13
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多