2

我有一个 ruby​​ 脚本,我在其中解析一个大的 csv 文件。除了如何处理线程的返回值之外,我已经处理了所有事情并且工作得很好。我有:

length = (ses.size/4).ceil
ses.each_slice(length) do |x|
    threads << Thread.new { a,b = splat x }
end

threads.each { |thr|
    thr.join
}

'splat' 返回到需要附加到输出文件 out1 和 out2 的临时文件。我正在迷茫到底在哪里做/如何获取这些信息。如果有人能指出我正确的方向,那就太好了。

4

1 回答 1

1

有两件事,首先,当您将“x”传递给线程时,通过更改它使其成为线程本地更安全:

threads << Thread.new { a,b = splat x }

进入这个:

threads << Thread.new(x) { |x| a,b = splat x }

接下来,要获取返回值,请使用:value加入。

所以这是我制作的一个快速演示:

dummy = [
  ['a.txt', 'b.txt'],
  ['c.txt', 'd.txt'],
  ['e.txt', 'f.txt'],
  ['g.txt', 'h.txt'],
  ['i.txt', 'j.txt'],
  ['k.txt', 'l.txt']
]

threads = dummy.map do |pair|
  Thread.new(pair) { |val| val }
end

vals = threads.map(&:value) # equiv. to 'threads.map { |t| t.value }'
puts vals.inspect

把它去掉,它应该能把你带到你想去的地方。

于 2013-08-15T22:52:53.613 回答