首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在x中Ruby Timeout.timeout不超时。

在x中Ruby Timeout.timeout不超时。
EN

Stack Overflow用户
提问于 2022-05-06 03:37:18
回答 1查看 172关注 0票数 0

以下代码

代码语言:javascript
复制
Timeout.timeout(2) do
  i = 0
  while(true)
    i = i + 1
    p "test #{i}"
  end
end

不会在2秒内超时。而下面类似的代码超时以2秒为单位

代码语言:javascript
复制
Timeout.timeout(2) do
  i = 0
  while(true)
    i = i + 1
    # p "test #{i}"
  end
end

根本的区别是什么?请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2022-05-06 04:50:42

我不知道这里到底发生了什么,我怀疑理解底层C代码的人会给出一个完整的答案。我有个线索。Matz解释器(MRI)有一个全局线程锁,这意味着在任何给定时间只有一个线程可以实际运行。线程的工作方式是,当一个线程在等待资源时,它会休眠,这会给另一个线程运行的机会。

超时将创建第二个线程,该线程将休眠2秒,然后在当前线程上引发一个异常,强制执行超时。我们保证这个线程不会在2秒前运行,但不会保证它在2秒后运行,但通常只有几毫秒左右,只有一些例外。

函数p是唯一的,因为它直接写到std.out。这是C程序员可能很有帮助的地方,但在我看来,它需要占用其他线程的资源,可能是因为要抛出异常,第二个线程需要拥有std.out。

ppp都会导致这个问题,而puts则不会。

为了支持资源饥饿理论,以下代码工作

代码语言:javascript
复制
Timeout.timeout(2) do
  i = 0
  while(true)
    i = i + 1
    p "testing timeout #{i}"
    sleep 0.001
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72135894

复制
相关文章

相似问题

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