正确使用ETS赠送功能

时间:2018-09-25 12:14:33

标签: erlang elixir ets

这是我的代码:

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表,然后此任务/进程会将所有权返回给父进程。

1 个答案:

答案 0 :(得分:5)

问题出在这条线上:

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

您正在尝试生成一个新进程,该进程以父pid作为参数调用一个函数,但是由于对self()的调用是在内部内,因此您会得到一个子进程pid代替。 (而且,如果某个进程试图向自己提供ETS表,则会收到“参数错误”。)

尝试一下:

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