我有一个套接字服务器监听传入数据的连接并在输入暂停期间写入传出数据。 由于这是在循环中,因此我正在进行
sleep
调用,以便在我的进程不需要立即输入时允许其他进程拥有一些 CPU 时间。
我知道
sleep
会这样做,但是 usleep
也会将执行返回给操作系统吗? 我很怀疑,因为我知道,传统上,sleep
系统调用只接受秒,而我十年前读过的一本关于C编程的非常老的书说,要“睡眠”更短的时间间隔涉及一些黑客行为,比如无限循环本质上是模拟 sleep
调用,但不会将 CPU 时间让给其他进程。 (这本书可能是错误的,或者可能不再准确,我只是告诉你它所说的内容。)
我使用的是 Linux、PHP 版本 5.6 和 7.1
谢谢你
它与平台相关,但在 Linux 上你可以使用这个简单的脚本来测试:
$start = microtime(true);
while(true){
while(microtime(true) - $start < .9){}
}
//while(true){
// usleep(900000);
//}
第一次使用
php test.php & top -d 0.1
运行它,观察错误的 sleep
是什么样子,完成检查后杀死生成的 php 进程 top
,注释掉第一个 while
循环并取消注释第二个循环,重新运行脚本并记下 CPU 使用情况。
感谢 Halcyon 给了我亲自测试的想法。
当然,主要区别在于 sleep 接受以秒为单位的参数,而 usleep 接受以微秒为单位的参数。一秒有 100 万 (1,000,000) 微秒。
另外,根据 PHP 文档中关于 usleep 的注释...
“在 MacOS X 和 Linux 上,usleep() 调用似乎会消耗 CPU 周期,而 sleep() 和 time_nanosleep() 则不会。”
来源:https://www.php.net/manual/en/function.usleep.php。 我无法证明此评论的准确性,因为我自己没有测试过。