Elixir System.cmd并行映射错误,超时

时间:2018-04-12 12:54:44

标签: parallel-processing elixir

我使用Task.async在Elixir中有一张平行地图。我正在使用它System.cmd来并行ruby rbenv install一个ruby版本字符串列表。

该脚本运行并安装ruby版本。但是,一旦安装了ruby版本并且Task.await超时错误错误,它就不会退出Task

我尝试将一个简单的IO.puts函数传递到并行映射中并且行为正确,在完成工作时退出并且不会引发错误。我在System.cmd中遗漏了什么,以确保每个rbenv进程完成后每个进程都结束。

# My parallel map
def pmap(collection, func) do
  collection
  |> Enum.map(&(Task.async(fn -> func.(&1) end)))
  |> Enum.map(&Task.await/1)
end

# System.cmd is being passed into the map like this
def parallel_install(ruby_versions) do
  pmap(ruby_versions, &(System.cmd("rbenv", ["install", &1])))
end

输出错误:

rbenv: /Users/lewis.jones/.rbenv/versions/2.4.4 already exists
rbenv: /Users/lewis.jones/.rbenv/versions/2.5.1 already exists
rbenv: /Users/lewis.jones/.rbenv/versions/2.1.10 already exists
rbenv: /Users/lewis.jones/.rbenv/versions/2.3.7 already exists
rbenv: /Users/lewis.jones/.rbenv/versions/2.2.10 already exists
** (exit) exited in: Task.await(%Task{owner: #PID<0.73.0>, pid: #PID<0.82.0>, 
ref: #Reference<0.100168651.1374158856.61975>}, 5000)
   ** (EXIT) time out
   (elixir) lib/task.ex:491: Task.await/2
   (elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2
   (elixir) lib/code.ex:376: Code.require_file/2

1 个答案:

答案 0 :(得分:1)

Task.await默认为5秒的超时。我猜rbenv install需要更长的时间。您可以增加超时或将其设置为无穷大。

300秒:

|> Enum.map(&Task.await(&1, 300_000))

或无限:

|> Enum.map(&Task.await(&1, :infinity))