多线程程序中的Ruby执行顺序

时间:2017-09-09 22:37:40

标签: ruby multithreading

在为飓风irma做准备时,我写了一个快速垃圾脚本,下载了一堆关于exercism.io的练习。它有效,但在调用threads.each时出现了一个错误,我不明白,所有的代码直到threads.each是同步的,如果我理解正确,那么我就是这样不确定最好的修复方法是:。

rb:14:in '<main>': undefined method 'each' for nil:NilClass (NoMethodError)

这对我很有意思,因为我收到了错误,但程序仍按预期运行,所以我确定我没有正确地写这个。

language = ARGV[0]

exercises = `exercism list #{@language}`.split("\n")

threads = exercises.map do |exercise|
  break if exercise == ''

  Thread.new do
    system("exercism fetch #{language} #{exercise}")
  end
end

threads.each(&:join)

1 个答案:

答案 0 :(得分:1)

使用next代替break,以便在任何练习空白时仍设置threadsbreak将取消整个循环,但next将仅跳过当前迭代。

如果他们的练习是空白的,那么一些线程仍然可以是nil,因为没有为他们开始线程。您可以使用threads.compact.each(&:join)跳过这些nil值。

或者,如果您需要break,请在循环内添加threads,如:

threads = []
exercises.each do |exercise|
  break if exercise == ''

  threads << Thread.new do
    system("exercism fetch #{language} #{exercise}")
  end
end