Erlang&r; rpc:multicall / 4 vs rpc:pmap / 3之间的区别

时间:2017-03-12 15:15:25

标签: concurrency erlang elixir rpc

我目前正在尝试在多个节点上运行一些Elixir代码,并且我使用了两种方法:1):rpc.multicall/4& 2):rpc.pmap/3

我可以看到两个节点都运行代码,我知道这些调用的结果是不同的(元组与列表)。

我缺少的两者之间是否存在其他重要差异,或者这两个函数是否相同,唯一的区别在于它们的调用方式和返回值?

提前致谢!

2 个答案:

答案 0 :(得分:1)

他们彼此真的不一样,

pmap将执行类似于:list.map的地图(此处更多http://erlang.org/doc/man/lists.html)但有一个优点是,只要节点可用连接并且有节点,就会在节点之间发生此调用列表上的值以执行地图。

另一方面,

multicall将始终执行相同的调用,并在多个节点中使用相同的args。 multicall/4在连接的所有节点中执行相同的函数调用。 multicall/5在开头加一个额外的参数,即执行rpc的节点列表。

当我们拥有3个炮弹的群集时,更好地进行示例

  • iex --sname node1
  • iex --sname node2
  • iex --sname node3

我们在node1执行

时相互连接
Node.connect :"node2@mymachine"
# => false
Node.connect :"node3@mymachine"
# => false

我们可以定义一个对2个值求和的函数,并将该值与执行此操作的节点一起返回:

iex(node1@mymachine)> defmodule Operation do
...(node1@mymachine)>   def sum(a, b), do: {Node.self(), a + b}
...(node1@mymachine)> end

有必要在每个shell中定义此函数。所以现在可以用多个值调用我们的pmap,看看会发生什么。在我的计算机中从node1调用时发生了这种情况。

iex(node1@mymachine)> :rpc.pmap {Operation, :sum}, [1], [1,2,3]
[node3@mymachine: 2, node2@mymachine: 3, node1@mymachine: 4]

对于每个节点,在最后一个位置使用不同的参数调用sum/2函数,从而产生不同的输出。如果我的:rpc.map/3的最后一个参数是一个包含较少元素的列表,那么节点可用则不必调用所有节点。但那些是完成手术所必需的。如果我传递了很多参数,它将以更平衡的方式返回调用。您可以尝试在每个节点上执行:rpc.pmap {Operation, :sum}, [1], Enum.to_list 1..20并自己查看结果。

另一方面,当我们使用:rpc.multicall/5时你并没有传递一个参数列表来并行执行每个参数,而是同时在多个节点中执行相同的参数。例如

iex(node1@mymachine)> :rpc.multicall(Operation, :sum, [2, 2], :infinity)
# => {[node1@mymachine: 4, node2@mymachine: 4, node3@mymachine: 4], []}

最后一个参数是在每个节点中执行的超时,如果满足此超时,则该节点的结果不会显示在元组的第一个列表中。

使用:rpc.multicall/5,可以将此调用将作为第一个参数执行的节点列表传递给它。例如,如果我只想在任何节点内的node2和node3中执行,我只需要执行

iex(node1@mymachine)> :rpc.multicall([:"node2@mymachine", :"node3@mymachine"] Operation, :sum, [2, 2], :infinity)
# => {[node2@mymachine: 4, node3@mymachine: 4], []}

需要注意的一点是,:rpc.multicall/4:rpc.pmap/3都可以在没有节点运行的情况下工作,这是因为对于erlangvm,无论何时触发iexerl您已经在单节点集群上。

答案 1 :(得分:0)

来自文档。

:rpc.multicall/5

  

multiicall是一个从一个客户端同时发送到多个服务器的RPC。这对于从一组节点收集信息或调用一组节点上的函数来实现某些副作用很有用。

:rpc.pmap/3

  

并行计算List1中每个元素Elem的apply(Module,Function,[Elem | ExtraArgs])。返回返回值列表,顺序与List1中的顺序相同。

因此multicall/5将在给定的节点集上调用单个函数。它将返回一个元组,其中第一个元素是结果列​​表,第二个元素是由于某种原因未完成该函数的节点列表。

尽管pmap/3与调用map类似,但工作可能会或可能不会在不同的节点上完成。重要的是要知道结果列表仍然与起始列表具有相同的顺序。

相关问题