【问题标题】:Proper use of ETS give away function正确使用 ETS 赠送功能
【发布时间】:2019-03-01 01:37:08
【问题描述】:

这是我的代码:

defmodule Parent do
  def arun(pid) do
    :ets.new(:my_table,[:named_table, :set, :public, read_concurrency: true])
    :ets.give_away(:my_table, pid, [])
  end

  def receiver do
    pid = spawn(fn -> arun(self()) end)
    receive do
      {'ETS-TRANSFER',_,_,_} ->
        IO.puts "ets got transferred"
      _ ->
        IO.puts "I dont know what happened"
    end
  end
end

但是当我试图编译这个运行时错误来了。

iex(31)> Parent.receiver

17:37:19.183 [error] Process #PID<0.204.0> raised an exception
** (ArgumentError) argument error
    (stdlib) :ets.give_away(:my_table, #PID<0.204.0>, [])
    parent.ex:4: Parent.arun/1

还有人可以告诉我制作 ets 表并将其所有权交给其他进程的正确方法吗? 我正在尝试这样做: 父进程将创建一个异步任务,该任务将创建一个 ets 表,然后此任务/进程将所有权返回给父进程。

【问题讨论】:

    标签: erlang elixir ets


    【解决方案1】:

    问题出在这一行:

        pid = spawn(fn -> arun(self()) end)
    

    您正在尝试生成一个以父 pid 作为参数调用函数的新进程,但由于对 self() 的调用是 inside 生成的,因此您将获得子 pid . (如果一个进程试图将一个 ETS 表给自己,它会得到一个“参数错误”。)

    试试这个:

        parent = self()
        pid = spawn(fn -> arun(parent) end)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多