Как напечатать результат в анонимной функции Elixir

Я хочу получить количество записей в удаленном узле, где запись имеет начало, равное << '* fb' >>. Вот мой код, однако он не возвращает результат. Вместо этого он просто возвращает идентификатор процесса #PID<10878.11003.0>. Как я могу заставить его вернуть счетчик записей?

Node.spawn :'abc@abc.com', sum = fn ->
  for n <- :mnesia.dirty_select(:'cz_jid_mapping',[{{:cz_jid_mapping, :'$1', :'_',:'_',:'_'},[],[:'$1']}]) do
    io.format((binary_part(n,0,3)==<<"*fb">>))
  end
end

1 ответ

Решение

Появившийся процесс запускается одновременно. Таким образом, если вы хотите отправить что-то процессу вызывающей стороны, вам нужно использовать сообщения:

me = self

Node.spawn :'abc@abc.com', sum = fn ->
  result = ...
  send(me, {:result, result})
end

receive do
  {:result, result} -> {:ok, result}
after timeout_in_ms -> {:error, :timeout}
end

Тем не менее, это много шаблонного и использования Node.spawn/2 следует избегать в производстве, поскольку это может привести к сбою, если разные узлы не имеют одинаковую версию модуля.

Лучше реализовать и экспортировать некоторую функцию, которая выполняет работу на локальном узле, например Db.record_count, Затем вы можете воспользоваться услугами :rpc модуль для вызова этой функции на каком-то другом узле. Особенно, :rpc.call вызовет функцию и вернет результат:

:rpc.call(:foo@bar, Db, :record_count, [arg1, arg2, ...], timeout_in_ms)
Другие вопросы по тегам