【发布时间】:2022-11-29 18:17:45
【问题描述】:
下面的代码
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
根本的区别是什么?请帮忙。
【问题讨论】:
-
似乎是 Ruby 2.x 的问题。该代码在 Ruby 1.9 和 Ruby 3 中都运行良好。(即它做~2s 后终止)
-
除了这个问题,
Timeout::timeout有点危险,因为它会在任意点中断您的代码,可能使您的系统处于未定义或易受攻击的状态。最好使用某种计时器,例如run = true标志以及Thread.start { sleep(2) ; run = false }和一个简单的while(run)循环。这样,它保证在完成一个完整的循环周期后完成。
标签: ruby ruby-on-rails-3