2. 从资源分配上来说,多进程方案比多线程方案更加灵活和自由
3. 不过任务间的通信方面多进程要比多线程复杂些,编一个好的多进程通信方案要比多线程间的通信方案困难多了(小伙伴们注意区分进程和线程哟~)
以web server为例的话,比如我的服务器上架设了三个网站,如果是用一个进程管理的话, 网站A遭受攻击死掉了,意味着另外两个网站会出现同样的现象. 如果是分开独立的进程的话,三个网站互不影响
具体来分呢, 单进程对比多进程有什么优点呢:
1) 初期实现起来比较简单快速, 而且不用考虑进程间通信的工作量
2) 单一性使得部署和运营比较简单(这还用说 / 白眼ing)
3) 内存占用少, 不过呢, 现在内存很廉价, 但是一分钱也是钱呀!
4) 进程内部通信效率比IPC/scoket(多进程数据通讯的终端)等要高效, 我一嗓子你就听见了, 就不用费力气装个电话了
当然, 肯定优缺点!不然花那么多钱开多进程的人也太蠢了 ~
单进程对比多进程的缺点~
1) 中后期随着业务逻辑的复杂化和需求的增加,这个单进程会变得臃肿, 难以维护。 一个任务分解成多个进程会使单个进程的逻辑简单,而不容易出错
2) 同进程内模块间是强依赖关系,需要在一起编译相互的影响也比较大。 这相对于多进程间通信来说, 耦合度较大(不符合高内聚低耦合的伟大思想), 不利于多团队并行开发。 多进程更便于多语言的协作开发。
3)任何模块的崩溃都将导致整个进程的失效,多进程模式更加稳定健壮,业务处理程序隔离运行, 一个go home不会影响其他(你敢崩我也崩);
4) 性能问题: 如果不支持进程间数据通讯的话,单进程的容量是受限的, 这个性能瓶颈对于支持群组类服务的尤其需要考虑。多进程部署极其灵活,可以扩充机器数量来提高系统处理性能,还可以从硬件上避免单点故障。(一个人承受不来)
5) 单进程中多线程难调试( 一开出去, 一群人倒了, 我还得检查一下谁中了才能给你debug)
举个小栗子
你有一个对象, 对象特别挑食, 但是对象只喜欢一种菜, 你每天做给她吃。
这就是个单进程单线程的模型, 如果你做的不好吃了, 对象不吃了。
但是我有一个对象, 她喜欢吃10种菜, 我每天端过去10份, 哪天其中某一份醋放多了, 对象说真难吃, 今天不吃了。这就是单进程多线程的模型。一个菜不好吃导致对象不吃了(全部线程崩掉)
.. 如果我有两个对象.. 每个对象喜欢吃一种菜
ok, 一个对象觉得好吃, 吃的脸圆圆的三下巴, 一个觉得不好吃常年不吃, 骨瘦如柴。
这就是多进程单线程互不影响的模型.. 多进程多线程我就不举栗了 ~
说到这里, 小伙伴有没有对单进程单线程有一些理解呢。nodeJs 就是单进程单线程的应用程序, 进程间互不影响, 绑定多个事件可以同时触发~ 不用等你完了我再有动作, 所以nodeJs性能很高。
nodeJs 单线程类似进入一个while(true ) 的事件循环, 知道没有事件观察者的时候退出(每绑定一个事件, 就生成一个事件观察者), 当有事件发生的时候, 就会调用该事件的回调函数。
事件驱动程序
nodeJs 使用事件驱动模型(稍后说), 当web server 接收到请求时, 就把它关闭然后进行处理, 然后去服务下一个web 请求。可以理解成我触发事件, 就先关闭这个事件驱动, 然后处理, 我觉得是在防止二次触发~ 造成不正确的负载和意料之外的结果,这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-84957-4.html
其实美帝来了12海里又怎么样