Правильное использование ETS расстаться с функцией - PullRequest
0 голосов
/ 25 сентября 2018

Итак, это мой код:

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, а затем эта задача / процесс вернет владение обратно родительскому процессу.

1 Ответ

0 голосов
/ 25 сентября 2018

Проблема в этой строке:

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

Вы пытаетесь создать новый процесс, который вызывает функцию с родительским pid в качестве аргумента, но поскольку вызов self() равен внутри спавн, вместо этого вы получаете детский пид.(И если процесс пытается выдать таблицу ETS самому себе, он получает «ошибку аргумента».)

Попробуйте это:

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