ruby – sleep 0有特殊意义吗?

在我的客户项目中,我看到很多睡眠用法0.

代码看起来像这样.

while true 
  ...
  ...
  sleep 0
end

通过阅读SO的一些答案,如this,似乎睡眠0具有一定的意义.

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

按顺序,Ruby VM会像上面的链接中提到的那样尊重sleep 0.

解决方法

是的,出于几个原因,首先,(mri)ruby线程是本机线程周围的包装器,带有额外的GVL锁.

当你调用sleep时,ruby正在做的事情就是调用底层的,本机的,平台相关的sleep并释放GVL,以便其他正在运行的线程可以获取它.因此,sleep(0)既可以等待可能等待执行的其他本机线程,也可以释放当前线程对GVL的保持,否则将阻止Ruby VM执行.

以下是关于如何从mri源中看到这一点的快速概述:

>我们从https://github.com/ruby/ruby/blob/trunk/process.c#L7542获得内核休眠的定义,我们看到它在函数rb_f_sleep中的c中实现
>接下来我们转到rb_f_sleep并看到在单个参数的情况下它调用rb_thread_wait_for
>转到rb_thread_wait_for定义,我们看到了对sleep_timeval调用
> sleep_timeval可致电native_sleep
> native_sleep是平台相关的,分别在thread_pthread.c和thread_win32.c中为posix和windows系统实现.在任何一种情况下,我们都会看到对GVL_UNLOCK_BEGIN herehere调用

编辑

更确切地说:

视窗:

native_sleep的windows实现使用WaitForMultipleObjects,它确实产生了剩余的时间片,参见:Does WaitForSingleObject give up a thread’s time slice?

POSIX:

posix实现使用pthread_cond_timedwait,它阻止当前运行的线程.

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...