首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby:等待所有使用join和ThreadsWait.all_waits完成的线程--有什么区别?

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

Stack Overflow用户
提问于 2015-05-22 15:15:27
回答 2查看 2.9K关注 0票数 7

请考虑以下示例:

代码语言:javascript
运行
复制
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(线程)

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

我知道ThreadsWait类还有其他有用的方法。特别是关于all_waits方法的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-22 16:56:11

文档清楚地指出,all_waits将在每个线程执行之后执行任何经过的块;join不提供类似的任何内容。

代码语言:javascript
运行
复制
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中实现同样的目标,我想您必须这样做:

代码语言:javascript
运行
复制
threads.each do |t|
  t.join
  puts "#{t} complete."
end # will return threads

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

如果没有任何块,我可以想象直接使用join会更快,因为您会减少所有的ThreadsWait方法。所以我试了一试:

代码语言:javascript
运行
复制
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 )
票数 8
EN

Stack Overflow用户

发布于 2021-07-09 09:14:04

使用map而不是每个映射,将等待它们,因为它需要它们的值来构建映射。

代码语言:javascript
运行
复制
(0..10).map do |_|
  Thread.new do
    # do async staff there
    sleep Random.rand(10)
  end
end.map(&:join).map(&:value)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30400319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档