如何在Elixir匿名函数中打印结果

时间:2015-04-16 08:41:52

标签: elixir mnesia

我想要做的是在远程节点中获取记录计数,其中记录的开头等于<<<<<<<<&#;;>'>>。这是我的代码,但它不会返回结果。相反,它只返回进程id#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 个答案:

答案 0 :(得分:4)

生成的进程同时运行。因此,如果要向调用者进程发送内容,则需要使用消息:

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)