我正在尝试从网站上抓取一些信息,但我以前从未使用过线程。我将这个测试组合在一起以模仿我正在尝试做的事情:
require 'thread'
mutex = Mutex.new
mut = Mutex.new
hash = {}
n = 0
a = []
b = []
# x = 0
10.times do |i|
a << Thread.new(i) do |top_index|
mutex.synchronize do
hash[top_index] = []
sleep 0.2
100.times do |sub_index|
b << Thread.new(top_index, sub_index, hash) do |t, s, my_hash|
mut.synchronize do
r = s
sleep 0.2
my_hash[t].push(s)
end
end
end
b.each {|y| y.join }
puts "sub: #{top_index} - #{hash[top_index].length}"
puts hash[top_index]
end
end
end
a.each {|q| q.join }
hash.each { |key, value| n += value.length }
puts "Final Tally - #{n}"
sleep
代表一些 RestClient请求,以及代表我从网站上抓取的一些信息的排序和 ing的get
数字。push
但是当查看输入所有内容的顺序时,我注意到数组之间的模式,所以我想知道何时r
在一个线程中分配它会影响它在另一个线程中的值。但这没有意义,因为这将严重限制它对并发请求的有用性。
另外,我认为由于一切都是并发的(或表现得像并发的),它应该在几秒钟内与睡眠定时器一起返回,但实际上需要相当长的一段时间。
我刚刚测试了它,它实际上比没有线程花费更长的时间?
线程总时间:204.04028
正常总数:203.133638
所以,现在我很困惑。