>æçå¼å 们ï¼ä½ ä»¬ä¿¡å¥æä»¬è£èç主è¶ç¨£åºç£ï¼ä¾¿ä¸å¯æçå¤è²å¾ 人ãè¥æä¸ä¸ªäººå¸¦çéææï¼ç©¿çåç¾è¡£æï¼è¿ä½ 们çä¼å å»ï¼åæä¸ä¸ªç©·äººï¼ç©¿çè®èè¡£æä¹è¿å»ï¼ä½ 们就éçé£ç©¿åç¾è¡£æç人说â请åå¨è¿æµ©ä½ä¸âï¼å对é£ç©·äººè¯´âä½ ç«å¨é£éâï¼æâå卿è蹬çä¸è¾¹âï¼è¿å²ä¸æ¯ä½ 们åå¿å¾ 人ï¼ç¨æ¶ææå®äººåï¼(JAMES 2:1-4) #ç¨tornadoåç½ç«(7) å°ä¸ä¸èç»æï¼å ¶å®è¯»è å·²ç»è½å¤åä¸ä¸ªç½ç«äºï¼ä½æ¯ï¼ä» ä» ç¨åé¢çææ¯æ¥åçç½ç«ï¼ä» è½ç®ä¸ä¸ªå°ç½ç«ï¼å¨[ã为åç½ç«èåå¤ã](./301.md)ä¸ï¼è¯´æä¹æä»¥étornadoï¼å°±æ¯å 为å®è½å¤è§£å³c10ké®é¢ï¼å³è½å¤å®ç°å¤§ç¨æ·é访é®ã è¦å®ç°å¤§ç¨æ·é访é®ï¼å¿ é¡»è¦åçå°±æ¯ï¼å¼æ¥ãé¤éä½ æ¯å¾åçå豪ã ##ç¸å ³æ¦å¿µ ###忥å弿¥ æä¸å°èµæå¯¹è¿ä¸¤ä¸ªæ¦å¿µåäºä¸åè§åº¦åå±é¢çè§£éã卿æ¥çï¼ä¸ä¸ªæå ¸åçä¾åå°±æ¯æçµè¯ååçä¿¡ã - æçµè¯å°±æ¯åæ¥ãå¼ ä¸ç»æåæçµè¯ï¼å¼ ä¸è¯´ï¼âæ¯æååï¼âãå½è¿ä¸ªä¿¡æ¯è¢«å¼ ä¸ååºï¼æäº¤ç»æåï¼å°±çå¾ æåçååºï¼ä¸è¬ä¼å¬å°âæ¯âï¼æè â䏿¯âï¼ï¼åªæå¾å°äºæåè¿åçä¿¡æ¯ä¹åï¼æè½è¿è¡åç»çä¿¡æ¯ä¼ éã - åçä¿¡æ¯å¼æ¥ãå¼ ä¸ç»æååçä¿¡ï¼ç¼è¾äºä¸å¥è¯â仿ä¸èµ·çèé½çé¶åºç¡å¦pythonâï¼åéç»æåãæåæè®¸é©¬ä¸åå¤ï¼æè®¸è¿ä¸æ®µæ¶é´ï¼è¿æ®µæ¶é´å¤é¿ä¹ä¸å®ï¼æåå¤ãæ»ä¹ï¼æåä¸ç®¡ä»ä¹æ¶ååå¤ï¼å¼ ä¸ä¼ä»¥å¬å°çä¿¡é声为æç¤ºæ¥ççä¿¡ã 以䏿¹å¼çè§£â忥âåâ弿¥â䏿¯å¾ç²¾åï¼æäºå°æ¹ææçµå¼ºãè¦ä¸¥æ ¼çè§£ï¼éè¦ç¨ä¸¥æ ¼ä¸ç¹çå®ä¹è¡¨è¿°ï¼ä»¥ä¸è¡¨è¿°åç §äº[ç¥ä¹](http://www.zhihu.com/question/19732473)ä¸çåçï¼ï¼ >忥å弿¥å ³æ³¨çæ¯æ¶æ¯éä¿¡æºå¶ (synchronous communication/ asynchronous communication) >æè°åæ¥ï¼å°±æ¯å¨ååºä¸ä¸ªâè°ç¨âæ¶ï¼å¨æ²¡æå¾å°ç»æä¹åï¼è¯¥âè°ç¨âå°±ä¸è¿åã使¯ä¸æ¦è°ç¨è¿åï¼å°±å¾å°è¿åå¼äºã æ¢å¥è¯è¯´ï¼å°±æ¯ç±âè°ç¨è â主å¨çå¾ è¿ä¸ªâè°ç¨âçç»æã >è弿¥åæ¯ç¸åï¼âè°ç¨âå¨ååºä¹åï¼è¿ä¸ªè°ç¨å°±ç´æ¥è¿åäºï¼æä»¥æ²¡æè¿åç»æãæ¢å¥è¯è¯´ï¼å½ä¸ä¸ªå¼æ¥è¿ç¨è°ç¨ååºåï¼è°ç¨è ä¸ä¼ç«å»å¾å°ç»æãèæ¯å¨âè°ç¨âååºåï¼â被è°ç¨è âéè¿ç¶æãéç¥æ¥éç¥è°ç¨è ï¼æéè¿åè°å½æ°å¤çè¿ä¸ªè°ç¨ã å¯è½è¿æ¯åé¢çæçµè¯ååçä¿¡æ´å¥½çè§£ã ###é»å¡åéé»å¡ âé»å¡åéé»å¡âä¸â忥å弿¥â常常被æ¢ä¸ºä¸è°ï¼å ¶å®å®ä»¬ä¹é´è¿æ¯æå·®å«çã妿æç §ä¸ä¸ªâå·®ä¸å¤âå ççæç»´æ¹æ³ï¼ä½ ä¹å¯ä»¥ä¸é£ä¹æ·±ç©¶å®ä»¬ä¹é´çå¦çä¸çå·®è·ï¼åæ£å¨ä½ çç¨åºä¸ï¼ä¼ä½¿ç¨å°±å¯ä»¥äºãä¸è¿ï¼å¿ è¦çä¸¥è°¨è¿æ¯éè¦çï¼ç¹å«æ¯æåè¿ä¸ªæç¨ï¼è¦è£ æ®ç让å«äººçæ¥èªå·±æï¼äºæ¯å°±åå¼ç¨[ç¥ä¹](http://www.zhihu.com/question/19732473)ä¸ç说æï¼æä¸ªäººè®¤ä¸ºï¼å«äººå·²ç»åçæºå¥½çä¸è¥¿ï¼å°±å«éå¤å³å¨äºï¼âæ¿æ¥ä¸»ä¹âï¼ä¹ä¸éãæè®¸ä½ 说ææè¢å山寨ï¼ä½æ¯ææç¡®åè¯ä½ æ¥æºäºï¼ï¼ >é»å¡åéé»å¡å ³æ³¨çæ¯ç¨åºå¨çå¾ è°ç¨ç»æï¼æ¶æ¯ï¼è¿åå¼ï¼æ¶çç¶æ. >é»å¡è°ç¨æ¯æè°ç¨ç»æè¿åä¹åï¼å½å线ç¨ä¼è¢«æèµ·ãè°ç¨çº¿ç¨åªæå¨å¾å°ç»æä¹åæä¼è¿åãéé»å¡è°ç¨æå¨ä¸è½ç«å»å¾å°ç»æä¹åï¼è¯¥è°ç¨ä¸ä¼é»å¡å½å线ç¨ã æç §è¿ä¸ªè¯´æï¼åçä¿¡å°±æ¯æ¾ç¶çéé»å¡ï¼ååºå»ä¸æ¡çä¿¡ä¹åï¼ä½ å©ç¨ææºè¿å¯ä»¥å¹²å«çï¼ä¹è³äºåå䏿¡âèé½çè¯¾ç¨æ²¡ææï¼è¿æ¯çPHPåºæ¿â乿¯å¯ä»¥çã å ³äºè¿ä¸¤ç»åºæ¬æ¦å¿µç辨æï¼ä¸æ¯æ¬æç¨çéç¹ï¼è¯»è å¯ä»¥åé è¿ç¯æç« ï¼[http://www.cppblog.com/converse/archive/2009/05/13/82879.html](http://www.cppblog.com/converse/archive/2009/05/13/82879.html)ï¼æç« ä½è åäºç»è´å ¥å¾®ç辨æã ##tornadoç忥 æ¤åï¼å¨tornadoåºç¡ä¸å·²ç»å®æçwebï¼å°±æ¯åæ¥çãé»å¡çãä¸ºäºæ´ææ¾çæåè¿ç¹ï¼ä¸å¦¨è¿æ ·è¯ä¸è¯ã å¨handlersæä»¶å¤¹ä¸å»ºç«ä¸ä¸ªæä»¶ï¼å½å为sleep.py #!/usr/bin/env python # coding=utf-8 from base import BaseHandler import time class SleepHandler(BaseHandler): def get(self): time.sleep(17) self.render("sleep.html") class SeeHandler(BaseHandler): def get(self): self.render("see.html") å ¶å®çäºæ ï¼å¦æè¯»è 对æå¨[ãç¨tornadoåç½ç«(1)ã](./303.md)ä¸æè®²è¿°çç½ç«æ¡æ¶çæï¼åºè¯¥ç¥éå¦ä½åäºï¼ä¸çæï¼è¯·å头å¤ä¹ ã sleep.htmlåsee.htmlæ¯ä¸¤ä¸ªç®åçæ¨¡æ¿ï¼å 容å¯ä»¥èªå·±åãå«å¿è®°ä¿®æ¹url.pyä¸çç®å½ã ç¶åçæµè¯ç¨å¾®å¤æä¸ç¹ç¹ï¼å°±æ¯æå¼æµè§å¨ä¹åï¼æå¼ä¸¤ä¸ªæ ç¾ï¼åå«å¨ä¸¤ä¸ªæ ç¾ä¸è¾å ¥`localhost:8000/sleep`ï¼è®°ä¸ºæ ç¾1ï¼å`localhost:8000/see`ï¼è®°ä¸ºæ ç¾2ï¼ï¼æ³¨ææç¨çæ¯8000端å£ãè¾å ¥ä¹åå ä¸è¦ç¹å»å车å»è®¿é®ãå好åå¤ï¼è®°ä½åæ¢æ ç¾å¯ä»¥ç¨âctrl-tabâç»åé®ã 1. æ§è¡æ ç¾1ï¼è®©å®è®¿é®ç½ç«ï¼ 2. 马ä¸åæ¢å°æ ç¾2ï¼è®¿é®ç½åã 3. 注æè§å¯ï¼ä¸¤ä¸ªæ ç¾é¡µé¢ï¼æ¯ä¸æ¯é½å¨æ¾ç¤ºæ£å¨è®¿é®ï¼è¯·çå¾ ã 4. 彿 ç¾1ä¸åç°çå¾ æç¤ºï¼æ¯å¦ä¸ä¸ªæ£å¨è½¬çååï¼æ¶ï¼æ ç¾2ç表ç°å¦ä½ï¼å ä¹åæ¶ä¹è®¿é®æåäºã 建议读è ä¿®æ¹sleep.pyä¸çtime.sleep(17)è¿ä¸ªå¼ï¼å¤è¯è¯ãå¾å¥½ç©çå§ã å½ç¶ï¼è¿æ¯æ¯è¾ç¬¨æçæ¹æ³ï¼æ¬æ¥æ¯å¯ä»¥éè¿æµè¯å·¥å ·å®æä¸è¿°æä½æ¯è¾çãæå¥è¦ç¨å«çå·¥å ·ï¼è¿è¦è¿è¡ä»ç»ï¼åå¤äºä¸ä¸ªåæ£ç²¾åçä¸è¥¿ï¼æ ç¨å¦æ¤ç¬¨æçæ¹æ³ï¼æå½æä¸ä¸ªä½ä¼ã ##弿¥è®¾ç½® tornadoæ¬æ¥å°±æ¯ä¸ä¸ªå¼æ¥çæå¡æ¡æ¶ï¼ä½ç°å¨tornadoçæå¡å¨å客æ·ç«¯çç½ç»äº¤äºç弿¥ä¸ï¼èµ·ä½ç¨çæ¯tornado.ioloop.IOLoopã使¯å¦æç客æ·ç«¯è¯·æ±æå¡å¨ä¹åï¼å¨æ§è¡æä¸ªæ¹æ³çæ¶åï¼æ¯å¦ä¸é¢ç代ç 䏿§è¡get()æ¹æ³çæ¶åï¼éå°äº`time.sleep(17)`è¿ä¸ªéè¦æ§è¡æ¶é´æ¯è¾é¿çæä½ï¼èè´¹æ¶é´ï¼å°±ä¼ä½¿æ´ä¸ªtornadoæå¡å¨çæ§è½åéäºã 为äºè§£å³è¿ä¸ªé®é¢ï¼tornadoæä¾äºä¸å¥å¼æ¥æºå¶ï¼å°±æ¯å¼æ¥è£ 饰å¨`@tornado.web.asynchronous`ï¼ #!/usr/bin/env python # coding=utf-8 import tornado.web from base import BaseHandler import time class SleepHandler(BaseHandler): @tornado.web.asynchronous def get(self): tornado.ioloop.IOLoop.instance().add_timeout(time.time() + 17, callback=self.on_response) def on_response(self): self.render("sleep.html") self.finish() å°sleep.pyç代ç å¦ä¸è¿°ä¸æ ·æ¹é ï¼å³å¨get()æ¹æ³åé¢å¢å äºè£ 饰å¨`@tornado.web.asynchronous`ï¼å®çä½ç¨å¨äºå°tornadoæå¡å¨æ¬èº«é»è®¤ç设置`_auto_fininsh`å¼ä¿®æ¹ä¸ºfalseã妿ä¸ç¨è¿ä¸ªè£ 饰å¨ï¼å®¢æ·ç«¯è®¿é®æå¡å¨çget()æ¹æ³å¹¶å¾å°è¿åå¼ä¹åï¼ä¸¤åªä¹é´çè¿æ¥å°±æå¼äºï¼ä½æ¯ç¨äº`@tornado.web.asynchronous`ä¹åï¼è¿ä¸ªè¿æ¥å°±ä¸å ³éï¼ç´å°æ§è¡äº`self.finish()`æå ³éè¿ä¸ªè¿æ¥ã `tornado.ioloop.IOLoop.instance().add_timeout()`乿¯ä¸ä¸ªå®ç°å¼æ¥ç彿°ï¼`time.time()+17`æ¯ç»åé¢å½æ°æä¾ä¸ä¸ªåæ°ï¼è¿æ ·å®ç°äºç¸å½äº`time.sleep(17)`çåè½ï¼ä¸è¿ï¼è¿æ²¡æå®æï¼å½è¿ä¸ªæä½å®æä¹åï¼å°±æ§è¡åè°å½æ°`on_response()`ä¸ç`self.render("sleep.html")`ï¼å¹¶å ³éè¿æ¥`self.finish()`ã è¿ç¨æ¸ æ¥äºãæè°å¼æ¥ï¼å°±æ¯è¦è§£å³åæ¥ç`time.sleep(17)`é æçæå¡å¨å¤çæ¶é´é¿ï¼æ§è½ä¸éçé®é¢ãè§£å³æ¹æ³å¦ä¸æè¿°ã 读è çè¿ä¸ªä»£ç ï¼æè®¸æè§æç¹ä¸æ¯å¾èæã妿æè¿ä¹ä¸ç¹æè§ï¼æ¯æ£å¸¸çãå 为å®éé¢é¤äºè£ 饰å¨ä¹å¤ï¼ç¨å°äºä¸ä¸ªåè°å½æ°ï¼å®è®©ä»£ç çé»è¾ä¸æ¯å¹³éºä¸å»ï¼èæ¯è¢«åå²ä¸ºäºä¸¤æ®µãç¬¬ä¸æ®µæ¯`tornado.ioloop.IOLoop.instance().add_timeout(time.time() + 17, callback=self.on_response)`ï¼ç¨`callback=self.on_response`æ¥ä½¿ç¨åè°å½æ°ï¼å¹¶æ²¡æå¦åæ¹é ä¹åç´æ¥`self.render("sleep.html")`ï¼ç¬¬äºæ®µæ¯åè°å½æ°on_response(self)`ï¼è¦å¨è¿ä¸ªå½æ°é颿§è¡`self.render("sleep.html")`ï¼å¹¶ä¸ä»¥`self.finish()`ç»å°¾ä»¥å ³éè¿æ¥ã è¿è¿æ¯æ§è¡ç®åé»è¾ï¼å¦æå¤æäºï¼ä¸æå°è¦è¿è¡âåè°âï¼æ æ³è®©é»è¾é¡ºå©å»¶ç»ï¼é£é¢ä¼âç©æâäºãè¿ç§ç°è±¡è¢«ä¸çæä¸ºâ代ç é»è¾æåâï¼æç ´äºåæé»è¾çé¡ºåºæ§ã为äºè®©ä»£ç é»è¾ä¸è³äºè¢«æåçä¸é¶å «è½ï¼äºæ¯å°±åºç°äºå¦å¤ä¸ç§å¸¸ç¨çæ¹æ³ï¼ #!/usr/bin/env python # coding=utf-8 import tornado.web import tornado.gen from base import BaseHandler import time class SleepHandler(tornado.web.RequestHandler): @tornado.gen.coroutine def get(self): yield tornado.gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 17) #yield tornado.gen.sleep(17) self.render("sleep.html") 仿´ä½ä¸çï¼è¿æ®µä»£ç é¿å äºåè°å½æ°ï¼çç顺å©å¤äºã åçç»èé¨åã é¦å 使ç¨çæ¯`@tornado.gen.coroutine`è£ é¥°å¨ï¼æä»¥è¦å¨å颿`import tornado.gen`ãè·è¿ä¸ªè£ 饰å¨ç±»ä¼¼çæ¯`@tornado.gen.engine`è£ é¥°å¨ï¼ä¸¤è åè½ç±»ä¼¼ï¼æä¸ç¹ç»å¾®å·®å«ã请é 读[宿¹å¯¹æ¤çè§£é](http://www.tornadoweb.org/en/stable/gen.html)ï¼ >This decorator(æengine) is similar to coroutine, except it does not return a Future and the callback argument is not treated specially. `@tornado.gen.engine`æ¯å¤æ¶åç¨çï¼ç°å¨æä»¬é½ä½¿ç¨`@tornado.gen.corroutine`äºï¼è¿ä¸ªæ¯å¨tornado 3.0以åå¼å§ãå¨ç½ä¸æ¥é èµæçæ¶åï¼ä¼éå°ä¸äºä½¿ç¨`@tornado.gen.engine`çï¼ä½æ¯å¨ä½ ä½¿ç¨æè åé´ä»£ç çæ¶åï¼å°±åæ¢å°å°å ¶ä¿®æ¹ä¸º`@tornado.gen.coroutine`好äºãæäºè¿ä¸ªè£ 饰å¨ï¼å°±è½å¤æ§å¶ä¸é¢ççæå¨çæµç¨äºã ç¶åå°±çå°get()æ¹æ³éé¢çyieldäºï¼è¿æ¯ä¸ä¸ªçæå¨ï¼åé æ¬æç¨[ãçæå¨ã](./215.md)ï¼ã`yield tornado.gen.Task(tornado.ioloop.IOLoop.instance().add_timeout, time.time() + 17)`çæ§è¡è¿ç¨ï¼åºè¯¥å çæ¬å·éé¢ï¼è·åé¢ç䏿 ·ï¼æ¯æ¥æ¿ä»£`time.sleep(17)`çï¼ç¶åæ¯`tornado.gen.Task()`æ¹æ³ï¼å ¶ä½ç¨æ¯âAdapts a callback-based asynchronous function for use in coroutines.âï¼ç±äºæç¿»è¯åéæ¼ä¿¡æ¯ï¼å¼ç¨[åæ](http://tornado.readthedocs.org/en/latest/gen.html)ï¼ãè¿ååï¼æå使ç¨yieldå¾å°äºä¸ä¸ªçæå¨ï¼å ææµç¨æèµ·ï¼çå®å ¨å®æ¯ï¼åå¤éç»§ç»æ§è¡ãè¦æé读è ï¼çæå¨é½æ¯å¼æ¥çã å ¶å®ï¼ä¸é¢å°å¦ä¸å¯¹ï¼å¯ä»¥ç¨ä»£ç 䏿³¨éäºçä¸å¥è¯æ¥ä»£æ¿`yield tornado.gen.sleep(17)`ï¼ä¹æä»¥æ©æï¼å°±æ¯ä¸ºäºé¡ºä¾¿çå°`tornado.gen.Task()`æ¹æ³ï¼å ä¸ºå¦æè¯»è å¨çå¤èçä»£ç æ¶åï¼ä¼éå°ã使¯ï¼åé¢ä½ åçæ¶åï¼å°±ä¸è¦é£ä¹å°å¦äºï¼è¯·ç¨`yield tornado.gen.sleep()`ã è³æ¤ï¼åºæ¬ä¸å¯¹tornadoç弿¥è®¾ç½®æäºæ¦è§ï¼ä¸è¿ï¼ä¸é¢çç¨åºå¨å®é 䏿²¡æä»ä¹ä»·å¼ãå¨å·¥ç¨ä¸ï¼è¦è®©tornadoç½ç«çæ£å¼æ¥èµ·æ¥ï¼è¿è¦åå¾å¤äºæ ï¼ä¸ä» ä» æ¯å¦ä¸é¢ç设置ï¼å 为å¾å¤ä¸è¥¿ï¼å ¶å®é½ä¸æ¯å¼æ¥çã ##å®è·µä¸ç弿¥ 以ä¸å项忥ï¼é»å¡ï¼çï¼å¦æå¨tornadoä¸æç §ä¹åçæ¹å¼åªç¨å®ä»¬ï¼å°±æ¯ætornadoçéé»å¡ã弿¥ä¼å¿ååäºã - æ°æ®åºçæææä½ï¼ä¸ç®¡ä½ çæ°æ®æ¯SQLè¿æ¯noSQLï¼connectãinsertãupdateç - æä»¶æä½ï¼æå¼ï¼è¯»åï¼åå ¥ç - time.sleepï¼å¨åé¢ä¸¾ä¾ä¸å·²ç»çå°äº - smtplibï¼åé®ä»¶çæä½ - ä¸äºç½ç»æä½ï¼æ¯å¦tornadoçhttpclient以åpycurlç é¤äºä»¥ä¸ï¼æè®¸å¨ç¼ç¨å®è·µä¸è¿ä¼éå°å ¶ä»ç忥ãé»å¡å®è·µãä» ä» å°±ä¸é¢å 项ï¼å°±æ¯ç¼ç¨å®è·µä¸ç»å¸¸ä¼éå°çï¼æä¹è§£å³ï¼ èªæç大çç¨åºå帮æä»¬åäºæ©å±æ¨¡åï¼ä¸é¨ç¨æ¥å®ç°å¼æ¥/éé»å¡çã - 卿°æ®åºæ¹é¢ï¼ç±äºç§ç±»ç¹å¤ï¼ä¸è½ä¸ä¸è¯´æï¼æ¯å¦mysqlï¼å¯ä»¥ä½¿ç¨[adb](https://github.com/ovidiucp/pymysql-benchmarks)æ¨¡åæ¥å®ç°pythonç弿¥mysqlåºï¼å¯¹äºmongodbæ°æ®åºï¼æä¸ä¸ªé常ä¼ç§ç模åï¼ä¸é¨ç¨äºå¨tornadoåmongodbä¸å®ç°å¼æ¥æä½ï¼å®å°±æ¯motorãç¹å«è´´åºå®çlogoï¼æåæ¬¢ã宿¹ç½ç«ï¼[http://motor.readthedocs.org/en/stable/](http://motor.readthedocs.org/en/stable/)ä¸çå®è£ åä½¿ç¨æ¹æ³é½å¾è¯¦ç»ã  - æä»¶æä½æ¹é¢ä¹æ²¡ææ¿ä»£æ¨¡åï¼åªè½å°½éæ§å¶å¥½IOï¼æè 使ç¨å ååï¼Redisï¼åææ¡£åï¼MongoDBï¼æ°æ®åºã - time.sleep()å¨tornado䏿æ¿ä»£ï¼`tornado.gen.sleep()`æè `tornado.ioloop.IOLoop.instance().add_timeout`ï¼è¿å¨åé¢ä»£ç å·²ç»æ¾ç¤ºäºã - smtpåéé®ä»¶ï¼æ¨èæ¹ä¸ºtornado-smtp-clientã - 对äºç½ç»æä½ï¼è¦ä½¿ç¨tornado.httpclient.AsyncHTTPClientã å ¶å®çè§£å³æ¹æ³ï¼åªè½çå°é®é¢å ·ä½è¯´äºï¼çè³æ²¡æå¾å¥½çè§£å³æ¹æ³ãä¸è¿ï¼è¿éæä¸ä¸ªå表ï¼ååºäºè¶³å¤å¤çåºï¼ä¾ä½¿ç¨è éæ©ï¼[Async Client Libraries built on tornado.ioloop](https://github.com/tornadoweb/tornado/wiki/Links)ï¼åæ¶è¿ä¸ªé¡µé¢éé¢è¿æå¾å¤å«ç龿¥ï¼é½æ¯å¾å¥½çèµæºï¼å»ºè®®è¯»è å¤ççã æç¨å°è¿éï¼è¯»è æ¯ä¸æ¯è¦æèä¸ä¸ªé®é¢ï¼æ¢ç¶å¯¹äºmongodbæä¸é¨çmotoråºæ¥å®ç°å¼æ¥ï¼åé¢å¯¹äºtornadoç弿¥ï¼ä¸ç®¡æ¯åªä¸ªè£ 饰å¨ï¼é½æè§éº»ç¦ï¼ææ²¡æä¸é¨çåºæ¥å®ç°è¿ç§å¼æ¥å¢ï¼è¿ä¸æ¯å¼æ³å¤©å¼ï¼è¿çæãä¹åºè¯¥æï¼å ä¸ºè¿æä½ç°pythonçç¹ç¹ãæ¯å¦[greenlet-tornado](https://github.com/mopub/greenlet-tornado)ï¼å°±æ¯ä¸ä¸ªä¸éçåºã读è å¯ä»¥æµè§å®æ¹ç½ç«æ·±å ¥äºè§£ï¼ä¸ºä»ä¹å¯¹mysqlé£ä¹ä¸ç§¯æå¢ï¼æç说åºè¯¥åºæ¥å¥½å¤æ¯æmysql弿¥çåºæå¯¹ï¼ã å¿ é¡»å£°æï¼å颿¼ç¤ºå¦ä½å¨tornadoä¸è®¾ç½®å¼æ¥ç代ç ï¼ä» ä» æ¯æ¼ç¤ºçè§£è®¾ç½®æ¹æ³ãå¨å·¥ç¨å®è·µä¸ï¼é£ä¸ªä»£ç çæä¹ä¸å¤§ã为æ¤ï¼åºè¯¥æä¸ä¸ªè¿ä¼¼äºå®è·µç代ç 示ä¾ãæ¯çï¼çç¡®åºè¯¥æã彿æ£è¦åè¿æ ·çä»£ç æ¶åï¼å¨ç½ä¸åç°ä¸ç¯æç« ï¼è¿ç¯æç« 黿¢äºæåï¼å 为æè¦åçé£ç¯æç« çä½è æ©å°±å好äºï¼èä¸æè®¤ä¸ºè¡¨è¿°é常å°ä½ï¼ç¤ºä¾ä¹è¯¦ç»ãæä»¥ï¼æä¸å¾ä¸æ¾å¼ï¼è½¬èæ¨èç»è¯»è è¿ç¯å¥½æç« ï¼ ä¸¾ä¾ï¼[http://emptysqua.re/blog/refactoring-tornado-coroutines/](http://emptysqua.re/blog/refactoring-tornado-coroutines/) ------ [æ»ç®å½](./index.md) | [ä¸èï¼ç¨tornadoåç½ç«(6)](./308.md) | [ä¸èï¼ä¸ºè®¡ç®ååå¤](./310.md) å¦æä½ è®¤ä¸ºæå¿ è¦æèµæï¼è¯·éè¿æ¯ä»å®ï¼**[email protected]**,ä¸èææ¿ã