我对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
答案 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/1
将Node.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