sleep 0 有特殊含义吗?

2024-05-14

我看到很多用法sleep 0在我的一个客户项目中。

代码看起来像这样。

while true 
  ...
  ...
  sleep 0
end

阅读一些像这样的答案this https://stackoverflow.com/questions/3727420/significance-of-sleep0看起来sleep 0有一定的意义。

我现在想知道的是,在时间片期间是否调度其他线程运行(如果它们正在等待运行)0是 lang VM(如 ruby​​ 或 python)的工作,或者是内核的工作。

为了让 Ruby VM 能够兑现sleep 0就像上面链接中提到的那样。


是的,出于几个原因,首先,(mri) ruby​​ 线程是带有附加 GVL 锁的本机线程的包装器。

本质上,当您调用 sleep 时,Ruby 所做的就是调用底层、本机、平台相关的 sleep 并释放 GVL,以便其他正在运行的线程可以获取它。所以sleep(0)既让出其他可能正在等待执行的本机线程,又释放当前线程对 GVL 的持有,否则会阻止 Ruby VM 执行。

以下是如何从核磁共振来源中看到这一点的快速概述:

  1. 我们得到内核睡眠的定义https://github.com/ruby/ruby/blob/trunk/process.c#L7542 https://github.com/ruby/ruby/blob/trunk/process.c#L7542,我们看到它是在c中实现的函数rb_f_sleep
  2. 接下来我们去rb_f_sleep并看到在单个参数的情况下它调用rb_thread_wait_for https://github.com/ruby/ruby/blob/trunk/process.c#L4379
  3. rb_thread_wait_for定义我们看到一个调用sleep_timeval https://github.com/ruby/ruby/blob/trunk/thread.c#L1172
  4. sleep_timeval有电话打给native_sleep https://github.com/ruby/ruby/blob/trunk/thread.c#L1111
  5. native_sleep与平台相关,并分别在 posix 和 windows 系统的 thread_pthread.c 和 thread_win32.c 中实现。在任何一种情况下,我们都会看到对GVL_UNLOCK_BEGIN here https://github.com/ruby/ruby/blob/trunk/thread_pthread.c#L1130 and here https://github.com/ruby/ruby/blob/trunk/thread_win32.c#L307

EDIT

更准确地说:

Windows:

Windows 实现native_sleep uses WaitForMultipleObjects这确实产生了剩余时间片,请参见:WaitForSingleObject 是否会放弃线程的时间片? https://stackoverflow.com/questions/4170272/does-waitforsingleobject-give-up-a-threads-time-slice

Posix:

posix 实现使用pthread_cond_timedwait,它会阻塞当前正在运行的线程。

无论哪种方式,这里要注意的主要事情是 Ruby 线程使用操作系统的底层线程阻塞机制,并通过任何睡眠调用释放 GVL,从而允许其他线程取得控制权。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sleep 0 有特殊含义吗? 的相关文章

  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • 如何将枚举作为字符串存储到rails中的数据库中

    如何在 ruby 中创建迁移 其中默认值是字符串而不是整数 我想将枚举存储到数据库中 但我不想将其存储为整数 因为这样对于另一个应用程序来说没有意义想要使用同一张桌子 我该怎么做default female 代替default 0 clas
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost
  • Ruby:如何编写 gem? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想为 Ruby 编写一个包并将其作为 gem 提供 有哪些工具 步骤和陷阱 有没有好的教程 截屏视频等
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • NUMA 在虚拟内存中是如何表示的?

    有许多资源 https en wikipedia org wiki Non uniform memory access从硬件角度描述NUMA的架构性能影响 http practical tech com infrastructure num
  • 在退出脚本之前等待后台进程完成

    在退出脚本 TCL Bash 之前 如何确保所有后台进程已完成执行 我正在考虑将所有后台进程 pid 写入 pid 文件 然后最后 pgrep pidfile 以查看在退出之前是否有任何进程仍在运行 有一些更简单的方法可以做到这一点吗 TC
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • 在 Mac OSX 上交叉编译 x86_64-unknown-linux-gnu 失败

    我尝试将我的 Rust 项目之一编译到 x86 64 unknown linux gnu 目标 cargo build target x86 64 unknown linux gnu Compiling deployer v0 1 0 fi
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • Rspec:期望与期望与块 - 有什么区别?

    刚刚学习 rspec 语法 我注意到这段代码有效 context given a bad list of players do let bad players it fails to create given a bad player li
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • Awk - 计算两个文件之间的每个唯一值和匹配值

    我有两个文件 首先 我尝试获取第 4 列中每个唯一字段的计数 然后匹配第二个文件的第二列中的唯一字段值 File1 第 4 列的每个唯一值和 File2 第 2 列包含我需要在两个文件之间匹配的值 所以本质上 我试图 gt 如果 file2
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp
  • 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一台运行 Ubuntu 的笔记本电脑 我想将其用作 Subversion 服务器 既让我自己在本地承诺 也让其他人远程承诺 要使其
  • 后台分叉无法正常工作[重复]

    这个问题在这里已经有答案了 我运行这个程序 在前景和背景中 int main int pid printf App Start pid d n getpid while 1 pid fork if pid 0 printf Child n
  • 让 TeXstudio 在 linux mint 中工作:找不到文件“url.sty”。

    刚刚切换到 Linux Mint 以前的顽固 Windows 用户 我在尝试安装 TeXstudio 时遇到一些问题 Sudo apt get install texstudio 给了我一个正确的安装 至少 我是这么认为的 但是当我尝试构建
  • 查找日期时间与今天日期匹配的记录 - Ruby on Rails

    我有一个交易表 需要查找日期与今天的日期匹配的记录 从 Rails 控制台 我需要匹配的日期字段如下所示 我已经分配了一条记录来进行测试 ruby 1 9 2 p0 gt deal start gt Tue 10 May 2011 00 0
  • 如何从另一个 .rb 文件访问模块内和类内的 Ruby 方法

    我想知道如何从另一个 rb 文件访问此模块中的方法 module Decisioning module Decision class OfferProxy lt FinanceApplication Offer def my method
  • C 编译器无法在 Mac OS Mountain Lion 上创建可执行文件

    我几乎浏览了每一页 但所有提示都不能解决问题 我正在运行 Mountain Lion 我有 Xcode 所有最新的开发工具 最新的 GCC 等等 我正在尝试设置 rbenv 和 ruby build 一切似乎都正常 但是当我去安装 ruby

随机推荐