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中实现 编辑 更确切地说: 视窗: native_sleep的windows实现使用WaitForMultipleObjects,它确实产生了剩余的时间片,参见:Does WaitForSingleObject give up a thread’s time slice? POSIX: posix实现使用pthread_cond_timedwait,它阻止当前运行的线程. 无论哪种方式,这里要注意的主要事情是Ruby线程使用操作系统的底层线程阻塞机制,并通过任何调用sleep释放GVL,允许其他线程获得控制权. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |