以下代码
Timeout.timeout(2) do
i = 0
while(true)
i = i + 1
p "test #{i}"
end
end不会在2秒内超时。而下面类似的代码超时以2秒为单位
Timeout.timeout(2) do
i = 0
while(true)
i = i + 1
# p "test #{i}"
end
end根本的区别是什么?请帮帮忙。
发布于 2022-05-06 04:50:42
我不知道这里到底发生了什么,我怀疑理解底层C代码的人会给出一个完整的答案。我有个线索。Matz解释器(MRI)有一个全局线程锁,这意味着在任何给定时间只有一个线程可以实际运行。线程的工作方式是,当一个线程在等待资源时,它会休眠,这会给另一个线程运行的机会。
超时将创建第二个线程,该线程将休眠2秒,然后在当前线程上引发一个异常,强制执行超时。我们保证这个线程不会在2秒前运行,但不会保证它在2秒后运行,但通常只有几毫秒左右,只有一些例外。
函数p是唯一的,因为它直接写到std.out。这是C程序员可能很有帮助的地方,但在我看来,它需要占用其他线程的资源,可能是因为要抛出异常,第二个线程需要拥有std.out。
p和pp都会导致这个问题,而puts则不会。
为了支持资源饥饿理论,以下代码工作
Timeout.timeout(2) do
i = 0
while(true)
i = i + 1
p "testing timeout #{i}"
sleep 0.001
end
endhttps://stackoverflow.com/questions/72135894
复制相似问题