gpt4 book ai didi

ruby - jRuby 线程——我做的对吗?

转载 作者:行者123 更新时间:2023-12-03 12:47:53 24 4
gpt4 key购买 nike

你介意告诉我我在 Ruby 中的线程是否正确吗?

我有一个数组items,我想在 16 个线程中处理,等待所有线程完成,然后再做更多的工作。

这是我的代码;

    chunks = items.each_slice(items.count / 16).to_a
puts chunks.length

queue = Queue.new
semaphore = Mutex.new
threads = []

puts '[+] Building Queue'
chunks.each do |chunk|
threads << Thread.new {
chunk.each do |item|
array = []
metadata.each do |m|
array << m.evaluate(item) rescue ''
end
semaphore.synchronize {
queue << array.join(20.chr)
}
end
}
end
puts '[+] Running threads'
threads.each{|t|t.join; puts 'Threads done'}

#Do more work here, queue should be fully populated
puts '[+] Writing to file'
File.open('E:/Export.dat', 'wt', encoding: 'UTF-16LE') do |f|
until queue.empty?
unit = queue.pop(true) rescue nil
if unit
f.puts unit
end
end
end

代码运行了,但没有给我期望的线程性能,对吗?

谢谢

最佳答案

您不太可能会看到性能改进,因为每个线程都在阻塞以将结果添加到队列中。 Queue 类是线程安全的,因此您不需要 Mutex 来保护它。

为了使多线程代码更好地工作,您希望每个线程尽可能独立地运行。下面的实现应该会提高性能。

chunks = items.each_slice(items.count / 16).to_a
puts chunks.length

queue = Queue.new
threads = []

puts '[+] Building Queue'
chunks.each do |chunk|
threads << Thread.new do
chunk.each do |item|
array = []
metadata.each do |m|
array << m.evaluate(item) rescue ''
end
queue << array.join(20.chr)
end
end
end
puts '[+] Running threads'
threads.each{|t|t.join; puts 'Threads done'}

#Do more work here, queue should be fully populated
puts '[+] Writing to file'
File.open('E:/Export.dat', 'wt', encoding: 'UTF-16LE') do |f|
until queue.empty?
unit = queue.pop(true) rescue nil
if unit
f.puts unit
end
end
end

您还需要衡量代码中的瓶颈所在。简单的计时器(开始时间和结束时间之间的差异)就可以了。如果使用线程评估元数据需要 10 毫秒,没有线程需要 100 毫秒,并且写入文件需要 1000 毫秒。这样您就不会注意到与多线程的巨大区别。

关于ruby - jRuby 线程——我做的对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44698034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com