gpt4 book ai didi

Ruby:使用 join 和 ThreadsWait.all_waits 等待所有线程完成 - 有什么区别?

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:07 28 4
gpt4 key购买 nike

考虑以下示例:

threads = []

(0..10).each do |_|
threads << Thread.new do
# do async staff there
sleep Random.rand(10)
end
end

完成后有两种等待方式:

  1. 使用连接:

    threads.each(&:join)
  2. 使用 ThreadsWait:

    ThreadsWait.all_waits(threads)

这两种方式有什么区别吗?

我知道 ThreadsWait 类还有其他有用的方法。并特别询问 all_waits 方法。

最佳答案

documentation明确指出 all_waits 将在每个线程执行后执行任何传递的 block ; join 不提供这样的东西。

require "thwait"

threads = [Thread.new { 1 }, Thread.new { 2 }]

ThreadsWait.all_waits(threads) do |t|
puts "#{t} complete."
end # will return nil

# output:
# #<Thread:0x00000002773268> complete.
# #<Thread:0x00000002772ea8> complete.

要使用 join 完成相同的操作,我想您必须这样做:

threads.each do |t|
t.join
puts "#{t} complete."
end # will return threads

除此之外,all_waits 方法最终会调用 join_nowait 方法,该方法通过调用 join 来处理每个线程。

如果没有任何 block ,我认为直接使用 join 会更快,因为您会减少导致它的所有 ThreadsWait 方法。所以我试了一下:

require "thwait"
require "benchmark"

loops = 100_000
Benchmark.bm do |x|
x.report do
loops.times do
threads = [Thread.new { 2 * 1000 }, Thread.new { 4 * 2000 }]
threads.each(&:join)
end
end

x.report do
loops.times do
threads = [Thread.new { 2 * 1000 }, Thread.new { 4 * 2000 }]
ThreadsWait.all_waits(threads)
end
end
end

# results:
# user system total real
# 4.030000 5.750000 9.780000 ( 5.929623 )
# 12.810000 17.060000 29.870000 ( 17.807242 )

关于Ruby:使用 join 和 ThreadsWait.all_waits 等待所有线程完成 - 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30400319/

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