## 定时-时钟-阻塞
定时执行,具体实现有两种形势,一种是类似于linux的计划任务,每隔一定时间去执行什么脚本任务,另一种是,比如,在php脚本里面做无限循环,每次循环睡眠多少时间,这个时间就是间隔。这两种方式表面上看似差不多,但有一个重要的细节,那就是第一种,如果任务很耗时,也不会阻塞计划任务,也就是说,如果任务耗时,任务需要两秒钟执行玩,计划任务间隔是一秒钟,那么可能会出现,有两个任务同时在执行的情况,这是如果涉及到资源抢夺和并发问题就需要考虑了。而第二种由于是靠循环来做定时的,所以任务执行过程中会阻塞定时,所以不会出现两个任务同时在执行。总之各有特点,在实际问题时,请谨慎考虑实际情况,在做决定,不要忽视掉这个重要的细节,性能和安全,首选安全,其次再考虑优化性能。
* * * * *
### 定时器程序是否受任务的阻塞
其实,问题的本质就是,定时器程序是否受任务的阻塞。比如linux的计划任务,肯定是有一个定时器,每隔一分钟读取计划任务配置,然后执行相应的任务,但是这个任务就是个命令行任务,定时器可能是利用某种方式执行它,无论这个命令行是做什么,它并不会阻塞定时器的下一分钟。所以定时器会无视所有东西,定时器永远按照它的循环方式,一分钟,又一分钟,没人能打扰。也就是说,它有一个承诺,那就是我能确定我没隔一分钟都会回来,它能履行这个承诺。而第二种方式虽然也是这样说,但是实际上它并不能履行承诺。这里关键一点,linux到底是怎么做到任务命令行不阻塞定时器的:
- php里面的几个可以直接执行系统命令的函数,能不能做到这样,不阻塞当前运行,有待实验,如果能做到,那么也能像linux计划任务那样了。
- 还有swool的定时器,会不会被里面的任务阻塞,也有待实验。
- 还有php脚本中使用命令行函数,执行的进程,和当前脚本是什么关系,如果当前脚本死了,会影响由它产生的进程吗,待实验。
- 还有以前v1版本的,常驻服务,启动时的几个脚本,待重新研究一下。
参考:
[JAVA互联网架构-同步、异步、阻塞和非阻塞区别](http://www.toutiao.com/a6464076225433305613/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=12619555732&utm_medium=toutiao_android&wxshare_count=1)
[PHP中如何执行shell命令-CSDN论坛](http://bbs.csdn.net/topics/390847194)
[PHP 调用shell命令 - 墨言莫问 - 博客园](http://www.cnblogs.com/daochong/p/7084729.html)
[php里调用shell命令【转】 - 午后的猫 - 博客园](http://www.cnblogs.com/Dreama/articles/3381380.html)
[php非阻塞访问url 解析socket阻塞与非阻塞,同步与异步 - 橙虚缘空间 - CSDN博客](http://blog.csdn.net/qq43599939/article/details/50570098)
* * * * *
### 定时器并发处理多任务(效率)
上面还漏掉一个细节,如果linux定时器,从配置读出来当前有好几个任务要执行,如果循环一个个执行会不会效率低,所以它可能这样,多个就创建多个子进程或线程去做这些事就快了,其实这就是多消息处理阻塞优化问题,比如如果用mysql我们读出来,多条任务消息待处理,如果使用循环,那么后面的任务要被前面的执行过程阻塞。效率就低,此时php脚本开多进程,就能明显加快任务的处理速度了。
> 任务间阻塞,可以开多进程执行解决。否则单纯的类似于事件循环方式的异步也没什么用,因为把任务堆积在事件队列里面也并没有从根本上解决问题从而加快任务的处理。
* * * * *
### 终究是一场模仿游戏
cpu就像是电脑的心脏,人的心脏在不停的跳动,并且有相对稳定的跳动频率,只要人活着,心脏就会跳动,以产生压力,让血液流动,代谢和运输氧气。这是生命的保证。心脏就像是一个定时器,每隔一个时间跳动一次,像个无限循环。所以对于电脑的心脏cpu也是这样,它的跳动就是时钟震荡。没想到很多东西本质都是相似的,这终究是一场模仿游戏,我们并没有创造出什么,我们只是一直在玩模仿游戏。
心脏就像cpu的震荡频率,有心跳频率,剧烈运动时心跳极速加快,恢复平静坐着时心跳减慢恢复正常。可见万物的规律都是一样。生命是最高级的科技。无论我们科技在高级,只能模仿,却不能凭空创造生命。(我认为克隆和利用现有材料/细胞合成的生命体不能算作是创造生命)
所以无论何时都要敬畏生命。
> 但也不能完全将cpu和心脏类比。对人体来说,心脏是提供血液循环动力的,将血液运送到全身,而思考的地方是大脑神经。cpu时钟频率的特点和心脏有类似,但是cpu更像是人的大脑。其实cpu本身没有思维能力,它只有简单的指令,应该说编程赋予了cpu像大脑一样的处理能力。不论怎么对比,总会太牵强,计算机不是仿生学,计算机的诞生是为了简化繁杂的计算,解放人力的。所以可以把计算机当作机械对待。不要完全将它和人对比。(汽车的发动机更像是电脑的电源而不是cpu,汽车上的中央控制器才是cpu)
[在一个时钟周期内,cpu仅完成一个最基本的动作,这个最基本的动作是什么动作?-超能网的回答-悟空问答](https://www.wukong.com/answer/6492978840963383565/?iid=12619555732&app=news_article&share_ansid=6492978840963383565&wxshare_count=1&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_android&utm_campaign=client_share)
TODO: 了解 在《我的世界》中建造模拟cpu是怎么回事
* * * * *
### 时钟震荡
[【10分钟速成课:计算机科学】第7集-CPU&时钟频率_趣味科普人文_科技_哔哩哔哩](http://m.bilibili.com/video/av12881976.html#tt_daymode=1)
> CPU以固定的频率震荡运行,超频后功率也会增加,并且会不稳定,低频功耗降低,但是运算能力降低。可见任何高级的东西,其实本质都很朴素,都是基本显而易见的原理,背后靠的都是朴素原始的蠢方法。
不过还是不要忘记上面讨论的,要注意的问题,时钟频率不会受影响吗。任何时候不要忽视细节,特别是重要的,但不起眼的细节,这种细节往往最关键。
[1秒究竟为什么是1秒?](https://mp.weixin.qq.com/s/tZN3eBZUflL9Xn6b1sS0_Q)
> 时间同重量、长度一样,都需要一个参照物才能表示。
* * * * *
### 问题的本质在哪里
linux计划任务那种不阻塞定时器,如果间隔很短,任务耗时很长,会出现任务同时在执行,甚至大量任务事件堆积,特别是任务涉及到资源抢夺时,大量任务会堆积阻塞,效率很低,所以你间隔频率快也是没用的。阻塞的情况,任务太耗时,你睡眠时间短也是没用。总之性能出在阻塞上,要找到问题的本质原因,深入研究,才能从根本上优化性能问题,否则抓不住本质,任何方法都是徒劳的。
[硬见创客,三分钟带你了解单片机时钟电路和振荡源!](http://www.toutiao.com/a6452301460725039629/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=12619555732&utm_medium=toutiao_android&wxshare_count=1)
[【C++札记】C++11并发编程(一)开启线程之旅](http://mp.weixin.qq.com/s/DypfPCogpsvcYRodXqjalQ)
> ……那么有没有方法解决上面的问题了,答案是肯定的,这就是我们下一篇需要讲述的内容。在本系列的下一篇文章中,我们将看到如何使用锁机制控制线程的执行顺序。
* * * * *
### 薛定谔的猫
事物真的是按照我们理解的那样吗?或者作为观察者,当我们决定观察时,结果就不是原本的答案了,我们永远看不到真相,只要我们去观察,就不会得到本来的模样,这就是薛定谔的猫。
* * * * *
### 计划任务 与 定时程序 的关系
定时任务和计划任务。linux那是计划任务,计划什么时候执行的任务,但是可以每天,重复,比如每个月几号。其实我们定的闹钟就是计划任务,但是闹钟程序本身,检测我们设置的闹钟并执行的程序,它是定时任务,闹钟肯定有个常驻进程每隔1秒钟检测一次,这个程序就是定时任务,也就是说,闹钟是定时任务执行着计划任务。
**定时程序执行任务时的细节 —— 是否阻塞**
不过我们还是注意不要忽略里面的细节,定时程序执行任务时会不会被任务阻塞,也就是它到底是通过什么方式取得任务并去执行任务的。
js的事件循环,就有点像定时器,调用延时函数后,定时器会在指定的时间把函数加到事件循环里面,形成队列,但是js是单进程的,所以队列里面的任务执行会相互阻塞。
进程调度,调用,一个进程是通过什么方式调用另一个进程,调用执行另一个进程时自己是否被阻塞,是否有不同的调用方式,以满足阻塞和非阻塞的调用,如果使用多进程,那么进程是否越多越好,受机器性能限制,那么这个线程数量,进程数量和机器配置在一个什么比例上才是平衡的。(可能类似于一个宽度已知的马路上同时行驶多少辆汽车时再能最大发挥运载能力)
* * * * *
### 交互程序 & 程序的生命周期
目前接触到的程序执行有两种方式,被访问,比如php,用户访问时执行文件。js有两种,加载后自上而下的主线程执行,还有事件绑定的触发。c语言有main函数做主入口。
js事件就是程序的交互(事件机制是利用事件循环实现的),有些程序需要和使用者交互,我们日常使用的大部分软件、游戏都是这样的。
再复杂的问题,在高级的方案,最终也会回归到最朴素的实现上面去,整个计算机都是如此。
> 网页web访问式程序,有一个主流程,主流程执行完后程序就结束了,而桌面客户端软件,虽然也有一个main主体,但是主流程执行完只是启动一些进程,这些进程并不会随着主线程执行完而关闭,而是一直在后台等待着与用户交互,比如游戏,以及我们常见的几乎所有的程序,比如QQ,文件管理器等等都是这种的。
> 一般的程序,代码从上到下,一溜烟就执行完毕退出了,所以要靠不断地循环来保持活着。(保持活着,一定要以某种方式不退出,被其他程序唤醒,被其他程序执行调用,严格来说不算活着,除非恢复到原有的上下文环境,这就是系统的进程切换了)
**其实这就是程序的生命周期。**
[回归本质 · 产品设计 · 看云](https://www.kancloud.cn/xiak/product/405382)
* * * * *
### 监控/监听是定时器吗?
gulp文件监控是什么原理,底层怎么实现的,是定时器吗,每隔一秒扫描检测文件是否变化?
监听怎么做到了文件变化了就能知道了,**这么智能?**
还有进程间通信,信号监听,这个信号监听是什么原理,发信号是什么原理,触发,还是定时扫描监听?
待研究……
[Everything Search Engine这款软件如何做到如此快速的搜索的? - 知乎](https://www.zhihu.com/question/22862246/answer/23020795)
> 实现对所有磁盘文件变化的监测. 你看到everything,可以在你复制一个文件之后,又在everything搜索列表内马上显示出来. **其实是everything本身会创建好几个线程,去监视所有磁盘的USN变化**. 变化包括 文件的 增 删 重命名等.这个时候everything就要实时更新自己的文件索引库. https://www.zhihu.com/question/22862246/answer/23058016
[swoole+inotify实现异步实时文件监控 - matyhtf的个人空间 - 开源中国](https://my.oschina.net/matyhtf/blog/343508)
[Linux inotify功能及实现原理 - 静之深 - 博客园](https://www.cnblogs.com/jingzhishen/p/3738637.html)
[真正的inotify+rsync实时同步 彻底告别同步慢 - Jacky's Blog - 博客园](https://www.cnblogs.com/jackyyou/p/5681126.html)
[定时任务常见实现方式](https://mp.weixin.qq.com/s/MbaMgkRfvMUVt1i3a_nFtg)
* * * * *
### 这个世界的运作方式
电子手表是依靠时钟震荡电路定时的,机械手表是靠发条定时走动的,发条和齿轮,发条提供动力,齿轮控制定时间隔与指针转动度数。世界上根本就没有什么神奇,尤其是技术,再富有技术含量的科技,背后底层往往都是一些最简单的常识和科学知识组成的。
这个世界上根本就没有什么**智能**,如果存在,那就存在上帝,但是上帝是不存在的。
如果真的存在智能的话,就监听就监听,想什么就是什么,想要什么样就有什么样,那还用我们这么辛苦的编程干什么?
只有简单,憨厚愚蠢的方法,朴素的事实。任何事情都是这样的。
如果要真说智能的话,生命才是智能的,人才是智能的,大脑才是智能的,计算机只是人造出来的工具,相对于人而言它运算非常快,但是它也优缺点,毕竟它只是个冰冷的机器,人虽然很智能,但是也有缺点,任何事物都是相对的,万物的规律,本质都是相通的,生命是最美好的,所以无论何时都要敬畏生命。
参考:[javascript - 究竟能不能用死循环?或者其实我们就活在一个死循环的世界中? - SegmentFault](https://segmentfault.com/q/1010000009586182)
> 或者我们人就是个死循环,再不断的接受信息,然后作出反馈,不然你喊我,我能立即回答,你真以为是你通知我了吗,是你拥有回调我的能力吗?搞笑!是我一直在监听着好吗?
https://developer.mozilla.org/en-US/docs/Games/Anatomy
> 网页游戏的 JavaScript 主循环应该怎么写,这篇文章一步步进行了讲解。
* * * * *
### 关于人的大脑
我觉得大脑是个很高级的东西,我们通常说心里想什么,其实心脏并不能想什么,我们人的思维,情绪实际上都是有大脑掌控的。大脑控制神经,人就可以做任何事情,比如吃饭喝水,走路,这些都是大脑控制的。
大脑也很奇怪,人的思维虚无缥缈,天马行空,根本抓不住,就像我现在大夏这行字的时候,我脑海里面飞快的想着一些事情,可能在想下一个字打什么,怎么组织语句,同时我又在想一些别的事情。
有时候我思绪很快,很乱,有时候突然想到的东西立马就忘记,完全记不得了,很多人应该有过这样的体验,你突然想说个什么事,但是刚要说的时候,脑子好像断电了,不记得你本来想要说什么了。
我们很多时候都是一心二用,我一边在打字,一边想着等会水烧开了我要起来倒水,又或者我的思想跑到明天去了,突然想到明天有个什么重要的事,总是我的思想我自己都抓不住,它太跳跃了,但是我好像发现一个规律,那就是它尽管很活跃,但是它同一时刻只能想一件事情,虽然看起来我在同时想多个事情,但其实同一时刻只是在想一个事情而已,只不过大脑切换很快而已。有的人可能会说,我就是可以同时做几件事情,并且都能够做好啊,我并不是说你不能同时做好几件事情,我是说同一时刻你大脑里面真能同时想几件事情吗,你尝试几次,你感觉一下这个区别,是不是这样的。
我们还能通过大脑感觉到疼痛,比如热水溅到手上会疼。这是神经的作用,皮肤上的神经感受细胞感受到高温后,向大脑传递了信息,大脑发出神经反射,于是我们就甩手了。
于是我们得出结论:
- 大脑是单进程的,只不过切换和运行速度很快。
- 大脑是有记忆里的,但是记忆会随着时间的推移而逐渐流逝,所以需要不断加强记忆才能不容易忘记。
- 大脑是个中央处理器,身体的神经细胞相当于传感器(比如听觉,嗅觉),传感器受刺激后,把神经信号发送给大脑,大脑做出反应,比如问到臭味你会捂住口鼻。(当然有一些低级简单的行为只是简单的神经反射,不需要经过大脑处理的),所以这个不算是大脑监听周围环境,而是环境刺激神经,大脑受到信号了,也就是触发。
- 大脑也有类似于CPU的三级缓存,用于加快处理速度,比如,对于经常做的事情,人会比较习惯,这类事情,如果遇到突发情况,大脑根本来不及反应,但是人出于本能也会按照正常情况反映一样。
- 大脑是单进程的,自然会有并发问题,如果很多事情突然在意瞬间来了,大脑一下子收到这么多神经信号,让你根本来不及反应过来,也就是常说的大脑还没反应过来,这就是大脑遇到并发问题了。这种情况,如上面所说,有一种本来,那就是长期形成的习惯,这类反应动作,在大脑里面会形成记忆(类似CPU的三级缓存),这类事件处理时就会快很多,不需要太多的思考,我们常说的本能就是这种。比如你很爱你的女朋友,让用生命去保护她你都不会犹豫一下,每次都是用右手牵着她过马路,突然有一天,有一辆车要撞向你们,非常突然,人根本来不及反应,此时你本能的反应就是推开女朋友(通常也叫做下意识的动作,就是无意识而自主根据某种习惯而做的动作),用自己的生命去保护她的安全,这种行为就是你的本能,你甚至都没有经过大脑思考,就做出这样的反应,这是为什呢,因为你太爱她了,你已经养成习惯保护她了,所以在遇到危险的时候,你本能就是这么做。
- 至于有些节目里面的天才,能左脑右脑同时运用的人,我就不知道了。以上只是我的自我感受。
>[danger] 池老师在《MacTalk·人生元编程》中 \[并发的错觉\] 一文中也讨论了这个问题。
[看这美国少年在做什么,就知马斯克为啥要做脑机接口的神秘公司了](https://www.ixigua.com/a6493300123173388813/?utm_source=toutiao&utm_medium=feed_stream#mid=6466670596)
[为什么手指泡水一段时间就会发皱?看完长知识了!](https://www.toutiao.com/a6492992224215695886/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=12619555732&utm_medium=toutiao_android&wxshare_count=1)
> 这说明变皱是一种自主行为而不是被动结果,是由自主神经控制血管收缩造成的无意识反应,就像我们的呼吸和心跳一样。
> 下意识,又名“潜意识”。心理学上指不知不觉、没有意识的心理活动,是有机体对外界刺激的本能反应。下意识仅从心理学意义上讲,即人的不自觉的行为趋向或受到外界影响不受控制做出的自然反应。
* * * * *
### 一切最终都是为了解决问题
所有东西都是要以解决问题为根本,不要迷失了自己,忘记了自己最初要的是什么,很多时候,秒级的定时器够了,一秒对我们来说过得很快,我这一句话说出来就过了几秒钟了,不要过分追求最小的时间粒度,当然有特殊情况对时间要求的级别特别高,但是我们绝大部分应用是没有那样的要求的,能解决问题就可以了,哪怕一开始解决问题的方式不够优雅,甚至有很多缺陷,那也没有关系,要知道在这个快速发展的社会中,拥抱变化,快速实现,快速推进,快速迭代,打破常规,迅速占领消费市场,才是最重要的。
* * * * *
### 监听:询问/触发(主动/被动)
要监听一个事件,知道一个事物的状态,有两种方式,第一定时不断地询问,这个缺点就是效率低,时效性不好,当然时效性取决于循环频率,而频率过快又会影响效率。第二种就是事物发生状态改变时自己通知你,这种是最理想的方式,效率高,没有不必要的轮询,也没有什么时效性的问题,几乎可以认为是实时的,但是这种方式需要监测着提前与被监测者建立关系,建立订阅的关系,当事物的状态改变时,就能发信号通知到监测者。队列主要使用第一种定时轮询的方式,只不过是优化了的,而互联网接口的webhook是第二种方式,比如你要监测淘宝的某个接口,或者是监测微信支付接口的支付结果,你应该是等它状态发生改变时自己通知你,而不是你不断地去轮询它,当然有些时候,你甚至可以两种方式一起使用,不过要注意解决你业务中可能出现的并发问题。开发任何程序,在设计之初,在每一个环节,并发情况都是时刻要考虑的。
不知道sook通信的底层是怎么做的,进程间的通信,端口的监听,信号,是怎么做的。
猜想一:应该是第二种通知方式和第一种轮询结合,不过通知占大部分比例,关键的设计理论应该通知,轮询为辅。应该是计算机总线控制所有信号的分发,信号由总线传递给其它进程的—通知。而总线是通过晶体时钟震荡电路感知收到进程发来的信号的—轮询。
猜想二:所有的东西都可以看成文件,信号也可以当成文件,比如nginx搭配php的工作方式就是就是监听127.0.0.1:9000.sook文件,所以每个信号在系统里面都对应一个文件,要监听信号直接监听对应的文件就可以了,sook通信可能就是这样的。当然怎么做到监听文件的具体细节又不得而知,可能就是第一种轮询的方式。
思考,如果是轮询,如果循环不等待,直接写无限循环的代码,那一秒钟能执行多少次呢,这个不同的编程语言应该不同吧,并且cpu是时间分片执行,在多个进程中快速切换的,所以不可能等同cpu的时钟吧,除非cpu只有这一个任务,但显然不可能cpu肯定还会被系统的其它进程所占用,所以这还取决于当前cpu的负载,有多少任务再执行。不过cpu真累啊,能者多劳嘛,谁叫它运行那么快呢。
> 对于万物论来说,每时每刻都有事件发生,你觉得什么时候发生,那是相对观察着的,即使没有观察者,事件也在发生,但是这样我们就不知道了,所以通常我们所说的发生,其实都是站在观察者的角度的。
>[danger] 而无论是主动还是被动,首先活着才是最重要的,活着是一切的可能,是一切的基础,而活着是要主动的,计算机天然的能主动的活着,那就是时钟震荡电路,CPU的震荡频率,CPU的心跳,已经这么快了,这足够成为一切的基础。
[Intel 酷睿i7 7700K](http://detail.zol.com.cn/1158/1157756/param.shtml) CPU主频:4.2GHz
4.2 \* 10^9 HZ,即1秒钟有4.2 \* 10^9个周期。
(赫兹是电,磁,声波和机械振动周期循环时频率的单位。即每秒的周期次数(周期/秒)。)
* * * * *
[【底层原理】用户进程缓冲区和内核缓冲区](https://mp.weixin.qq.com/s/W8GGupa6FuizbWU9CJ5B_Q)
> 计时器:计算机能计时是因为晶体振荡器产生的电磁脉冲。那么所有的定时任务都是以它为基础的。
>
> (电扇里面的定时器是个扭力发条,这样记时并不精确,使用年限越长越不准了)
> 当然,write并不一定导致内核的写动作,比如os可能会把内核缓冲区的数据积累到一定量后,再一次写入。**这也就是为什么断电有时会导致数据丢失。**
我将继续探寻计算机工作的一些核心,找寻本质。(堆栈,内存管理,中断,晶体振荡器,三极管,总线,进程,线程,协程,CPU调度,IO,TCP/IP)
* * * * *
### 操作系统之上 — 抽象
编程界的锁是系统实现的,计算机本没有锁的概念,也就是说锁是人们设计系统时抽象出来的,计算机本身并不具备这个概念,也无法规避并发问题,如果系统不实现锁就会有很多麻烦的事不好处理,比如并发的问题,计算机底层一会傻傻的做事,cpu甚至只知道一条一条的处理指令,这些指令并不是来自同一个进程的连续指令,因为cpu的时间被分片了,所以它压根就不在乎它在做什么,当然也就没有程序概念了,它不知道并发写文件会出现什么,这不是它要考虑的问题,因为它根本就不在乎,这是你程序的逻辑的问题,只有你在乎,所以,你不考虑并发,不加锁,读写文件,内存就会出现和你预期不一样的结果,也就是你写的程序有问题。比如文件乱码,运行结果不符合预期,这就是你的问题了,你写的BUG,这么来看,对于cpu来说,并没有什么bug,你认为的bug对它而言就是简单的指令而已。其它的它不在乎,它只单纯的活在自己的世界里。仅此而已。
并发却是现实世界中真真切切存在的问题,比如排队买票,几乎我们每天的生活都与并发有关,因为在我们的生活中,我们不仅仅是一个单独的个体,我们要融入这个社会,是要和他人打交道的。把个体的人看作进程的话,社会看作运行的计算机的话,就会清晰很多,这个环境中无时无刻不在进行着并发。
它不知道什么是对和错,对它而言,或者说在它的世界里,本就没有对和错的概念。
* * * * *
### 并发
做并发编程之前,必须首先理解什么是并发,什么是并行,什么是并发编程,什么是并行编程。
并发(concurrency)和并行(parallellism)是:
解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
[并发和并行有什么区别? | 并发编程网 – ifeve.com](http://ifeve.com/parallel_and_con/)
> 任何事情是相对的,理论上存在同一时刻,但是却无法实际证明,因为时间可以无限细分,所以即使我们说的是某一时刻,其实也是某一时间段。
[php非阻塞访问url 解析socket阻塞与非阻塞,同步与异步 - 橙虚缘空间 - CSDN博客](http://blog.csdn.net/qq43599939/article/details/50570098)
* * * * *
### 程序:单进程/多进程(单线程/多线程)
程序分为两种,单进程和多进程程序,程序的执行引起资源的争夺,就出现了并发,由这引发出串行,并行,异步,同步,阻塞,非阻塞等概念和问题。不过现在的程序,基本都不是单进程程序了,特别是网络程序,诞生之初就是为了服务大量用户的,并且多进程程序能充分利用cpu,提高软件的效率。当然特殊情况也有单进程的程序,比如浏览器中的js就是单进程的,这是为了降低复杂度,和提高dom的操作效率。
* * * * *
### 来源于生活
生活中的事件监听,比如光控开关,声控开关,就是触发通知式的,比如光照不同引起光敏电阻的反应,声波震动触动了声控薄膜,这就是传感器监听外界信号的物理案例。任何东西都能在自然界,生活中找到相似之处,找到灵感,和影子。
* * * * *
### 关于循环
循环分为 有限循环 和 无限循环 ,无限循环又有 可控 和 不可控 两种。死循环 即 不可控的无限循环(老师常说的不要写出死循环BUG就是指不可控的无限循环了),可以理解成系统中有一个失控的进程了,此时只能使用kill来终止杀死这个进程了。
BUG = 死循环 = 无限循环 + 不可控
我们平常为了简单,表达上有一些歧义,容易把 死循环 理解成了 无限循环 了,其实这个说法有很大问题,以后还是要避免这样的问题,任何时候必须用准确的词语来表达意思。
当我们说 无限循环 的时候一般默指为 可控的无限循环,但这种习惯真的很不好,一定要表达清楚。
[javascript - 究竟能不能用死循环?或者其实我们就活在一个死循环的世界中? - SegmentFault](https://segmentfault.com/q/1010000009586182)
《Ruby元编程》里的一句话说的很好,我感觉放到这里很合适
> 根本没有什么元编程,从来只有编程而已。
我认为死循环也是一样,存在即为合理,只是看你如何去用而已,在没有更好的解决方案的时候,解决问题很重要,在有更好的解决方案的时候,代码优雅同样重要,根本就没有什么死循环,从来只有循环而已。
* * * * *
[Html5+Lufylegend.js游戏开发(一)引擎介绍及原理 - 奔跑的QQEE - 博客园](https://www.cnblogs.com/wuyiblogs/p/5878308.html)
> 在游戏中,有一个比较重要的元素就是ENTER_FRAME时间轴事件,时间轴事件说白了就是死循环
受学习php影响,脚本执行有超时和内存限制(命令行模式没有这个限制),这就意味着脚本不能够长时间执行。所以潜意识中所有程序都是这样的,不能接受无限循环的代码,**觉得程序应该尽早执行完并退出,甚至受web访问式影响,只能写出被动运行的代码,不了解常驻服务程序的结构。** 但其实并不是这样的,这是思维受禁锢了。
![](http://cdn.aipin100.cn/18-6-11/14922067.jpg)
游戏就是一种无限循环,画面就是一帧一帧不断循环而显示出来的。[【游戏开发】Unity游戏开发零基础入门教程_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili](https://www.bilibili.com/video/av13288553?from=search&seid=12795476358543930858)
![](http://cdn.aipin100.cn/18-6-12/18289573.jpg)
要加死循环,不加的话exe运行一次就会退出
[手把手教你如何将翻译程序打包成exe文件](https://mp.weixin.qq.com/s/ux9XuqDKgPC6uKzV-olOFQ)
[wxPython:一套Python语言的GUI工具箱](https://mp.weixin.qq.com/s/Jj-a14jf_PZpLRnglsmp3A)
> app.MainLoop() # Then start the event loop.
>
> **事件监听,窗体运行,就是一个无限可控的循环。** 没有循环,程序也就执行完毕关闭了,这种编程方式和传统的web模式有很大的区别,web模式,一个请求的脚本要很快执行完毕并结束。
* * * * *
[一个自动加湿器的制作过程,程序的作用有多大,看了便知!](https://www.365yg.com/a6545636034074378766)
> 主循环是死循环吗?
> 是的 重复执行程序任务。
* * * * *
[处理亿级数据的“定时任务”,如何缩短执行时间?](https://mp.weixin.qq.com/s/aN-M8YcwXNE462HaVrQ6ig)
[从Timer类源码分析,猜想今日头条的取消推荐文章的技术实现](https://www.toutiao.com/i6488636316970910222/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=12619555732&utm_medium=toutiao_android&wxshare_count=1)
> 你那个死循环合不合适啊
关键字:BUG,死循环,无限循环,不可控循环,可控循环
[在WordPress中使用wp-cron插件来设置定时任务](http://www.jb51.net/article/76183.htm)
[PHP实现执行定时任务的几种思路详解 - Web烤猫 - SegmentFault](https://segmentfault.com/a/1190000002955509)
[基于Laravel Task-Scheduler定时发送邮件小程序 - 来生做个漫画家 - SegmentFault](https://segmentfault.com/a/1190000005057786)
[Laravel 5.2 文档 服务 —— 任务调度 – Laravel学院](http://laravelacademy.org/post/3267.html)
[详解PHP实现定时任务的五种方法_php技巧_脚本之家](http://www.thinkphp.cn/topic/42571.html)
> 定时运行任务对于一个网站来说,是一个比较重要的任务,比如定时发布文档,定时清理垃圾信息等,现在的网站大多数都是采用PHP动态语言开发的,而对于PHP的实现决定了它没有Java和.Net这种AppServer的概念,而http协议是一个无状态的协议,PHP只能被用户触发,被调用,调用后会自动退出内存,没有常驻内存。
[PHP 实现定时任务的几种方法 - ThinkPHP框架](http://www.thinkphp.cn/topic/42571.html)
[PHP实现定时任务的几种方式-PHPChina开发者社区-权威的PHP中文社区](http://www.phpchina.com/portal.php?mod=view&aid=41051)
[php 定时任务_百度搜索](https://www.baidu.com/s?wd=php+%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1&ie=utf-8&rsv_cq=php+%E5%8D%95%E4%BE%8B&rsv_dl=0_right_recommends_20807&euri=5c209d60170a7167991896a99f87be1f)
**思考:**
代码中的无限循环,CPU是怎么对待的呢,永久占用CPU的时间片段吗,那其他程序不是都没执行机会了?还是优先级高一些而已?
有答案了,系统会强制让进程让出CPU时间片的。
[小白科普:线程和线程池](https://mp.weixin.qq.com/s/qzoLgNNSZD2NrzBEINVuUg)
~~~
问:一个web端过来的请求是不是就意味着占用着一个进程 如果是cpu密集型操作就会一直占用该进程直至请求结束 并发情况下其它请求需要等待空闲进程?
回复:即使是CPU密集型, 也会在时间片到期的时候,让出CPU的。然后OS再调度,看看谁来执行。
~~~
[一分钟了解nohup和&的功效](https://mp.weixin.qq.com/s/nyT-FPdIUdJUiUCYVGEnTg)
~~~
问:环程序,在实际软件中,有没有应用呢?以前学校老师c语言的课上总说,千万不要写出死循环的代码,死循环就是最严重的BUG。不知道是不是这样的,但是感觉现在很多软件,比如队列,监听接口等,底层实现好像都是死循环,别人说这叫,空循环,无限循环之类的,并不认为死循环是BUG。同时我还想知道,这样死循环的代码,CPU是怎么对待的,会持续抢占cpu时间片吗,如果这样,那别的进程怎么办?希望大神解答一下,或者给个提示让我去找找资料。谢谢了!
回复:服务(service)的本质就是死循环程序,监听端口,接收并响应请求
服务的本质就是死循环,哈哈,那么就剩第二个问题了,cpu如何对待死循环的程序?
~~~
* * * * *
### 单例定时程序
定时程序,常驻程序要注意以单实例模式启动,不能同时启动多个,否则会出现重复执行并发等问题,这就违背了设计的意图了。
> ### 13.5 单实例守护进程
> 为了正常运作,某些守护进程实现为,在任意时刻只运行该守护进程的一个副本,例如,这种守护进程可能需要排它地访问一个设备。对cron守护进程而言,如果同时有多个实例实例运行,那么每个副本都可能试图开始某个预定的操作,于是造成该操作的重复执行,这很可能导致出错。
……
如果每个守护进程创建一个固有名字的文件,并在该文件的整体上加一把写锁,那么只允许创建一把这样的写锁。在此之后创建写锁的尝试都会失败,这向后续守护进程副本指明已有一个副本正在运行。
(UNIX环境高级编程第三版 P-380)
[自动化 - 关于php 自动/定时 执行函数 (将api中的数据每十分钟录入数据库) - SegmentFault](https://segmentfault.com/q/1010000011365312)
> 记得每次访问加个锁,比如文件锁.避免重复执行的问题
[redis - PHP用什么来快速消费队列 - SegmentFault](https://segmentfault.com/q/1010000004326627)
> 此shell要判断当前有没有消费进程在
* * * * *
last update:2018-1-5 15:00:44
- 开始
- 公益
- 更好的使用看云
- 推荐书单
- 优秀资源整理
- 技术文章写作规范
- SublimeText - 编码利器
- PSR-0/PSR-4命名标准
- php的多进程实验分析
- 高级PHP
- 进程
- 信号
- 事件
- IO模型
- 同步、异步
- socket
- Swoole
- PHP扩展
- Composer
- easyswoole
- php多线程
- 守护程序
- 文件锁
- s-socket
- aphp
- 队列&并发
- 队列
- 讲个故事
- 如何最大效率的问题
- 访问式的web服务(一)
- 访问式的web服务(二)
- 请求
- 浏览器访问阻塞问题
- Swoole
- 你必须理解的计算机核心概念 - 码农翻身
- CPU阿甘 - 码农翻身
- 异步通知,那我要怎么通知你啊?
- 实时操作系统
- 深入实时 Linux
- Redis 实现队列
- redis与队列
- 定时-时钟-阻塞
- 计算机的生命
- 多进程/多线程
- 进程通信
- 拜占庭将军问题深入探讨
- JAVA CAS原理深度分析
- 队列的思考
- 走进并发的世界
- 锁
- 事务笔记
- 并发问题带来的后果
- 为什么说乐观锁是安全的
- 内存锁与内存事务 - 刘小兵2014
- 加锁还是不加锁,这是一个问题 - 码农翻身
- 编程世界的那把锁 - 码农翻身
- 如何保证万无一失
- 传统事务与柔性事务
- 大白话搞懂什么是同步/异步/阻塞/非阻塞
- redis实现锁
- 浅谈mysql事务
- PHP异常
- php错误
- 文件加载
- 路由与伪静态
- URL模式之分析
- 字符串处理
- 正则表达式
- 数组合并与+
- 文件上传
- 常用验证与过滤
- 记录
- 趣图
- foreach需要注意的问题
- Discuz!笔记
- 程序设计思维
- 抽象与具体
- 配置
- 关于如何学习的思考
- 编程思维
- 谈编程
- 如何安全的修改对象
- 临时
- 临时笔记
- 透过问题看本质
- 程序后门
- 边界检查
- session
- 安全
- 王垠
- 第三方数据接口
- 验证码问题
- 还是少不了虚拟机
- 程序员如何谈恋爱
- 程序员为什么要一直改BUG,为什么不能一次性把代码写好?
- 碎碎念
- 算法
- 实用代码
- 相对私密与绝对私密
- 学习目标
- 随记
- 编程小知识
- foo
- 落盘
- URL编码的思考
- 字符编码
- Elasticsearch
- TCP-IP协议
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依赖注入
- 开发笔记
- 经纬度格式转换
- php时区问题
- 解决本地开发时调用远程AIP跨域问题
- 后期静态绑定
- 谈tp的跳转提示页面
- 无限分类问题
- 生成微缩图
- MVC名词
- MVC架构
- 也许模块不是唯一的答案
- 哈希算法
- 开发后台
- 软件设计架构
- mysql表字段设计
- 上传表如何设计
- 二开心得
- awesomes-tables
- 安全的代码部署
- 微信开发笔记
- 账户授权相关
- 小程序获取是否关注其公众号
- 支付相关
- 提交订单
- 微信支付笔记
- 支付接口笔记
- 支付中心开发
- 下单与支付
- 支付流程设计
- 订单与支付设计
- 敏感操作验证
- 排序设计
- 代码的运行环境
- 搜索关键字的显示处理
- 接口异步更新ip信息
- 图片处理
- 项目搭建
- 阅读文档的新方式
- mysql_insert_id并发问题思考
- 行锁注意事项
- 细节注意
- 如何处理用户的输入
- 不可见的字符
- 抽奖
- 时间处理
- 应用开发实战
- python 学习记录
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文档相似度验证
- thinkphp5.0数据库与模型的研究
- workerman进程管理
- workerman网络分析
- java学习记录
- docker
- 笔记
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京东
- pc_detailpage_wareBusiness
- doc
- 电商网站设计
- iwebshop
- 商品规格分析
- 商品属性分析
- tpshop
- 商品规格分析
- 商品属性分析
- 电商表设计
- 设计记录
- 优惠券
- 生成唯一订单号
- 购物车技术
- 分类与类型
- 微信登录与绑定
- 京东到家库存系统架构设计
- crmeb
- 命名规范
- Nginx https配置
- 关于人工智能
- 从人的思考方式到二叉树
- 架构
- 今日有感
- 文章保存
- 安全背后: 浏览器是如何校验证书的
- 避不开的分布式事务
- devops自动化运维、部署、测试的最后一公里 —— ApiFox 云时代的接口管理工具
- 找到自己今生要做的事
- 自动化生活
- 开源与浆果
- Apifox: API 接口自动化测试指南