gpt4 book ai didi

ruby - 访问存储在实例变量中的线程的线程变量

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

这是预期的,

t = Thread.new{
Thread.current[:rabbit] = 'white'
}

##### t[:rabbit] = white

但是我不明白这个:

class Whatever
def initialize
@thd = Thread.new{
Thread.current[:apple] = 'whatever'
}
end

def apple
@thd[:apple]
end

def thd
@thd
end
end

我想访问这些,为什么它们是nil

Whatever.new.apple # nil

Whatever.new.thd[:apple] # nil

Whatever.new.thd.thread_variable_get(:apple) # nil

为什么会这样?如何访问 @thd 线程变量?

最佳答案

您在这里看到的是竞争条件。您试图在线程主体运行之前读取线程变量

比较以下内容:

w = Whatever.new
w.apple
# => nil

w = Whatever.new
sleep 0.1
w.apple
# => "whatever"

线程主体是否及时运行 Whatever.new.apple 几乎是随机的,对我来说似乎有 0.1% 的时间发生,但这可能与其他情况不同机器

1000.times.
map { Whatever.new.apple }.
each_with_object(Hash.new(0)) { |val, memo| memo[val] += 1 }
# => {nil=>999, "whatever"=>1}

2000.times.
map { Whatever.new.apple }.
each_with_object(Hash.new(0)) { |val, memo| memo[val] += 1 }
# => {nil=>1998, "whatever"=>2}

(注意:我不能尝试更多的迭代,因为大量的线程生成会导致我的 IRB 耗尽资源)

这与我听说过的“异步的第一条规则”有关,即您不能从同步方法获取异步方法的返回值。处理此问题的通常方法是使用“回调”,Ruby 可以以 yield/ block 的形式执行此操作。

我建议寻找有关如何在 Ruby 中进行异步编程的教程。

关于ruby - 访问存储在实例变量中的线程的线程变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56696548/

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