【发布时间】:2018-04-12 12:54:44
【问题描述】:
我在 Elixir 中有一个使用 Task.async 的并行映射。我将它与 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
【问题讨论】:
-
你为什么要通过
rbenv安装 Ruby 版本,首先使用从 Elixir 调用的 shell? -
在工作中获得一点乐趣
标签: parallel-processing elixir