﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-harrygoo learning-随笔分类-js</title><link>http://www.blogjava.net/harrygoo/category/50114.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 14 Nov 2011 14:15:13 GMT</lastBuildDate><pubDate>Mon, 14 Nov 2011 14:15:13 GMT</pubDate><ttl>60</ttl><item><title>如何解决阻塞问题</title><link>http://www.blogjava.net/harrygoo/archive/2011/11/14/363712.html</link><dc:creator>harrygoo</dc:creator><author>harrygoo</author><pubDate>Mon, 14 Nov 2011 12:15:00 GMT</pubDate><guid>http://www.blogjava.net/harrygoo/archive/2011/11/14/363712.html</guid><wfw:comment>http://www.blogjava.net/harrygoo/comments/363712.html</wfw:comment><comments>http://www.blogjava.net/harrygoo/archive/2011/11/14/363712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/harrygoo/comments/commentRss/363712.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/harrygoo/services/trackbacks/363712.html</trackback:ping><description><![CDATA[<div><p><strong><span style="color: red;">无阻塞编程。</span></strong></p><p><strong><span style="color: red;"></span></strong></p><div><p>Js代码：</p> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "> </span><span style="color: #0000FF; "><div><pre>//根据ID，在数据库中Persons表中查出Name </pre></div>var</span><span style="color: #000000; ">&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;db.query(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">select&nbsp;name&nbsp;from&nbsp;persons&nbsp;where&nbsp;id=1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">); <div><span style="color: #000000; "><span style="color: #000000; "><pre>//进程等待数据查询完毕，然后使用查询结果。</pre></span></span></div><div><span style="color: #000000; "><pre><div><pre>output("name");</pre></div></pre></span></div></span></div><pre>   </pre> <p>这段代码的问题是在上面两个语句之间，在整个数据查询的过程中，当前程序进程往往只是在等待结果的返回.这就造成了进程的阻塞.对于高并发，I/O 密集行的网络应用中，一方面进程很长时间处于等待状态，另一方面为了应付新的请求不断的增加新的进程.这样的浪费会导致系统支持QPS远远小于后端数据服 务能够支撑的QPS，成为了系统的瓶颈.而且这样的系统也特别容易被慢链接攻击(客户端故意不接收或减缓接收数据，加长进程等待时间)。</p></div><br /><p>&nbsp;</p><p>可以引入<strong style="font-size: 10pt; color: red;">事件处理机制</strong>解决这个问题。在查询请求发起之前注册数据加载事件的响应函数，请求发出之后立即将进程交出，而当数据返回后再触发这个事件并在预定好的事件响应函数中继续处理数据：</p> <p>Js代码：</p> <pre>//定义如何后续数据处理函数 <br /> function onDataLoad(name){     output("name");  }  //发起数据请求，<br />同时指定数据返回后的回调函数  <br />db.query("select name from persons where id=1",onDataLoad);  </pre> <p>我们看到若按照这个思路解决阻塞问题，首先我们要提供一套高效的异步事件调度机制.而主要用于处理浏览器端的各种交互事件的JavaScript。相对于其他语言，至少有两个关键点特别适合完成这个任务。</p></div><div>http://www.infoq.com/cn/articles/why-recommend-nodejs<br /><br /><div><strong style="color: red;">闭包</strong>就是让函数在运行时能够访问到函数定义时的所处作用域内的所有变量，或者说函数定义时能访问到什么变量，那么在函数运行时通过相同的变量名一样能访问到。<br /><br /><div><strong><span style="color: red;">函数编程语言</span></strong>最重要的数学基础是&#955;演算(lambda calculus) -- 即函数对象可以作为其他函数对象的输入(参数)和输出(返回值)。<br /><br /><div>在传统网页开发中，用户的状态通过请求传递到服务端，交由后端状态保持(类似交给db.query的currentSate)。而使用Ajax的网页，因为并未离开原页面，那么服务端只要负责校验用户提交的数据是否正确即可，发送错误，返回错误处相关信息即可，这就是所谓<strong><span style="color: red;">前端状态保持</span></strong></div></div></div></div><img src ="http://www.blogjava.net/harrygoo/aggbug/363712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/harrygoo/" target="_blank">harrygoo</a> 2011-11-14 20:15 <a href="http://www.blogjava.net/harrygoo/archive/2011/11/14/363712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>