【问题标题】:Elixir System.cmd in parallel map erroring with timeoutElixir System.cmd 在并行地图错误与超时
【发布时间】: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


【解决方案1】:

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

300 秒:

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

或无穷大:

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

【讨论】:

  • 谢谢,为此。事实证明,rbenv 正在等待我需要忽略 rbenv 的输入:/Users/lewis.jones/.rbenv/versions/2.4.4 已经存在继续安装? (是/否)n
  • @LewisJones echo 'y' | rbenv ...
  • @LewisJones 可能有一种方法可以用一些标志来确认命令。尝试rbenv install --help(或任何打印install 帮助的命令),看看你是否找到了什么。
  • 不能在 System.cmd 中做管道,除非你执行一个 shell。 System.cmd 更像 exec 而不是 cmd
猜你喜欢
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多