Erlang 正确使用ETS释放功能

Erlang 正确使用ETS释放功能,erlang,elixir,ets,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

这是我的代码:

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
iex(31)>Parent.receiver
17:37:19.183[错误]进程#PID引发异常
**(ArgumentError)参数错误
(stdlib):ets.give_away(:my_table,#PID,[]))
parent.ex:4:parent.arun/1
还有谁能告诉我制作ets表并将其所有权授予其他进程的正确方法? 我正试图做到这一点:
父进程将创建一个异步任务,该任务将创建一个ets表,然后此任务/进程将所有权返回给父进程。

问题出在这一行:

    pid = spawn(fn -> arun(self()) end)
您正试图生成一个新进程,该进程调用一个以父pid为参数的函数,但由于对
self()
的调用在生成内,因此您会得到子pid。(如果一个进程试图将一个ETS表传递给它自己,它会得到一个“参数错误”。)

试试这个:

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

问题出在这一行:

    pid = spawn(fn -> arun(self()) end)
您正试图生成一个新进程,该进程调用一个以父pid为参数的函数,但由于对
self()
的调用在生成内,因此您会得到子pid。(如果一个进程试图将一个ETS表传递给它自己,它会得到一个“参数错误”。)

试试这个:

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