正确使用ETS可以提供​​功能

aru*_*ani 1 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
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译此运行时错误即将到来.

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
Run Code Online (Sandbox Code Playgroud)

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

leg*_*cia 5

问题出在这一行:

    pid = spawn(fn -> arun(self()) end)
Run Code Online (Sandbox Code Playgroud)

您正在尝试生成一个新进程,该进程使用父pid作为参数调用函数,但由于调用self() spawn中,因此您将获得子pid.(如果进程试图向自己提供ETS表,则会出现"参数错误".)

试试这个:

    parent = self()
    pid = spawn(fn -> arun(parent) end)
Run Code Online (Sandbox Code Playgroud)