监听程序都是 while(true){......}或者死循环吗?
今天搭建laravel的队列,执行了php artisan queue:work命令,和同事讨论是不是是一个死循环。进而上升到tcp监听ip:端口号,apache 其实都是死循环程序(while(true){…..}),他认为不是,觉得死循环太low,而且程序怎么能写死循环呢,这样太消耗系统资源。
我的关观点是:不论什么语言,所有的程序无非 顺序执行 分支执行(if else) 循环执行。既然是监听程序,那就是永不退出的程序,那就只能是死循环,没有别的选择
他的观点是:(他之前是写java的)具体是什么也不清楚,但是绝对不是死循环这么low,尤其是tcp链接监听数据,可能是timer。
我事后又在想,其实很多程序都是不退出的,比如正在运行的win操作系统,打开的窗口,其实都是不退出,但是不退出除了死循环还有比的方式吗?我倒是 不是想争论对错,就是突然对这个问题来了兴趣,想来求证一下,有哪位大神可以解说一下吗?非常感谢


关于 LearnKu
具体得看你的循环逻辑里面有没有导致进程阻塞的操作。如果不会阻塞的话,那的确会占用系统资源。不过一般死循环里面都是放一些通讯相关的逻辑,比如 tcp 监听,这些是会导致进程进入阻塞态的。在阻塞态的进程是不占用什么系统资源的,只是在 cpu 进程调度的时候多循环一次而已。
比如下面这段代码:
在
socket_accept这里会阻塞,在没有新的连接到来的时候,进程是阻塞的,cpu 在进程调度的时候,看到这个进程是阻塞的,就去看下一个进程的状态了。具体可以看看操作系统原理进程调度相关的内容。