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

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

Node.spawn :'[email protected]', 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

person want_to_be_calm    schedule 16.04.2015    source источник


Ответы (1)


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

me = self

Node.spawn :'[email protected]', 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)
person sasajuric    schedule 16.04.2015
comment
Сасс спасибо за помощь - person want_to_be_calm; 16.04.2015