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

wan*_*alm 1 mnesia elixir

我想要做的是获取远程节点中的记录计数,其中记录的开头等于 <<'*fb'>>。这是我的代码,但是它不返回结果。相反,它只返回进程 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
Run Code Online (Sandbox Code Playgroud)

sas*_*ric 5

生成的进程同时运行。因此,如果你想向调用者进程发送一些东西,你需要使用消息:

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
Run Code Online (Sandbox Code Playgroud)

然而,这是很多样板文件,Node.spawn/2在生产中应该避免使用,因为如果不同的节点没有完全相同的模块版本,它可能会失败。

最好实现并导出一些在本地节点上完成工作的函数,例如Db.record_count。然后,您可以使用:rpc模块中的服务来调用其他节点上的该函数。特别是,:rpc.call将调用该函数并返回结果:

:rpc.call(:foo@bar, Db, :record_count, [arg1, arg2, ...], timeout_in_ms)
Run Code Online (Sandbox Code Playgroud)