gpt4 book ai didi

ruby - 为什么 with_progress 做 "Thread.new"?

转载 作者:数据小太阳 更新时间:2023-10-29 08:02:14 25 4
gpt4 key购买 nike

This code根据 gem list 将 gem 安装到您的项目中。为什么它需要为此生成线程?

module Gemifest
class Installer
def initialize(gem)
@gem = gem
end

def perform!
begin
$stdout = StringIO.new('')
$stderr = StringIO.new('')
with_progress 'Installing ' + @gem.name do
`#{@gem_command} install --no-ri --no-rdoc #{@gem.line}`
end
ensure
$stderr = STDERR
$stdout = STDOUT
end
end

private

def with_progress(label)
STDERR.print label
begin
t = Thread.new do
loop do
STDERR.print('.')
STDERR.flush
sleep 0.8
end
end
yield
STDERR.puts ' done!' unless $?.exitstatus > 0
rescue => e
STDOUT.puts "Error:"
STDOUT.puts e.message
ensure
t.kill
end
end
end
end

最佳答案

如果您要删除 Thread.new,则 yield 将在 loop do ... end 完成后执行(即永远不会) .

将循环放在单独的线程中的目的是它应该与 block 同时执行,然后在 block 完成后被终止。

关于ruby - 为什么 with_progress 做 "Thread.new"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1406333/

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