Как напечатать результат в анонимной функции 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)