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 有特殊含义吗? 的相关文章

  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • gem install rmagick 在 OS X El Capitan 上失败

    几天前我升级到 El Capitan 并运行了 brew update brew upgrade 它更新了 imagemagick 导致 ruby 的 rmagick gem 停止工作 我想没问题 我就跑 gem install rmagi
  • time.sleep、Flask 和 I/O 等待

    使用时time sleep Flask 请求会被阻止吗 我的 Flask 端点之一启动了一个长处理子任务 在某些情况下 可以等待任务完成并在同一请求中返回结果 而不是异步执行工作 在这种情况下 我的 Flask 应用程序启动该过程 然后等待
  • unix 下日期字段排序

    我有包含数十万条记录的文本文件 其中一个字段是日期字段 有没有办法根据日期字段对文件进行排序 09 APR 12 04 08 43 632279000 AM 19 MAR 12 03 53 38 189606000 PM 19 MAR 12
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

    我尝试在我的服务器上安装 docker 使用本教程 https docs docker com install linux docker ce ubuntu 我想远程运行 docker 镜像并使用 portainer Web 界面来管理一切
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • 如何在 JS Rails 响应中包含 HTML?

    我有一个响应 HTML 和 JS AJAX 查询的 FooController app controllers foo controller rb class FooController lt ApplicationController l
  • 类似 jq 中的 sql join

    我有以下 json id 1 type folder title folder 1 id 2 type folder title folder 2 id 3 type item title item 1 folder 1 id 4 type
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • Ruby 的字符串并置功能的官方文档在哪里?

    我最近意识到 如果你并置一系列 Ruby 字符串文字 例如 a b c 它相当于这些字符串文字的串联 但是 我在任何地方都找不到这种语言功能的记录 我使用术语 并置 和 串联 进行搜索 但只在几个 StackOverflow 响应中找到了对
  • 有没有可以在 HTML 文档之间进行比较的 ruby​​ gem?

    事实证明 对两个不同的 html 文档进行比较是一个完全不同的问题 而不仅仅是对纯文本进行比较 例如 如果我在以下之间进行简单的 LCS 差异 Google and Google diff 结果不是 but a gt github com
  • 回形针不支持 .doc 文件

    在 Rails 4 0 2 中 我使用回形针 gem 上传文件 但它不支持 doc 文件 在文件上传字段下方 显示一条错误消息 扩展名与其内容不匹配 在模型中 检查内容类型的验证如下 validates attachment content
  • 下载所有 gems 依赖项

    我想通过下载任何所需的文件并将它们带到另一台计算机来安装指南针没有互联网连接 我已经下载了指南针的源包 当我在未连接的计算机上运行 gem 时 它抱怨缺少依赖项 有什么解决办法吗 这正是我遇到的问题 经过一段时间的搜索后 我找到了一个可以使

随机推荐