Elixir在匿名函数中生成没有自递归的进程

时间:2018-01-30 17:36:20

标签: functional-programming erlang elixir

我对elixir和函数式编程一般都是新手,我想知道下面的具体示例如何添加'节点'在spawn / 3函数的第3个参数的当前空列表中。

  def create(n) do
    nodes = Enum.map(1..n, fn(_) -> spawn(Node, :begin, []) end)
  end

例如我想要做的就是这样:

  def create(n) do
    nodes = Enum.map(1..n, fn(_) -> spawn(Node, :begin, [nodes]) end)
  end

我已尝试过管道和预先声明的节点,但作为进程,它们已经生成,并且已经按照其他方式触发了begin函数。

我正在尝试做什么,并且需要节点用于类Node,如下所示

defmodule Node do
  def begin(nodes) do
    # do stuff with nodes here
  end
end

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,我相信你需要先创建节点。

Enum.map(1..n, fn ... create node here ... end)

然后将它们传递给地图操作,该操作将使用Node.begin函数评估您的节点。

Enum.map(nodes, &Node.begin/1)

如果Node.begin是一些昂贵的(繁重工作负载)操作,您可以利用创建异步任务来处理单独进程中繁重的工作负载。

nodes
|> Enum.map(&(Task.async(fn -> Node.begin(&1) end))) 
|> Enum.map(&Task.await/1)

仅供参考:&Node.begin/1Node.begin函数传递给Enum.map的回调。地图调用中的&(...)部分是简写匿名函数。

这是最终的代码:

# If Node.begin is a heavy operation
def create(n) do
  Enum.map(1..n, fn -> ... create nodes here ... end)
  |> Enum.map(&Node.begin/1)
end
# If Node.begin will take some muscle to complete
def create(n) do
  Enum.map(1..n, fn -> ... create nodes here ... end)
  |> Enum.map(&(Task.async(fn -> Node.begin(&1) end)))
  |> Enum.map(&Task.await/1)
end