1.wordpressådjangoåªä¸ªå¥½ï¼
2.Tornado主要特点
3.UNIX环境高级编程UNIX网络编程12这三本书先看哪个一个?网络编程和web编程疑惑,码解pythontornado源码学习
4.为什么选择tornado作为web开发框架?码解
5.å¦ä½ç解 Tornado
wordpressådjangoåªä¸ªå¥½ï¼
导读ï¼å¾å¤æåé®å°å ³äºwordpressådjangoåªä¸ªå¥½çç¸å ³é®é¢ï¼æ¬æé¦å¸CTOç¬è®°å°±æ¥ä¸ºå¤§å®¶å个详ç»è§£çï¼ä¾å¤§å®¶åèï¼å¸æ对大家ææ帮å©ï¼ä¸èµ·æ¥ççå§ï¼Pythonä¸å¤§webæ¡æ¶åå«æ¯ä»ä¹åªä¸ªæ´å¥½ã导读ãç®åï¼Pythonæ¯è¾ç«çä¸å¤§webæ¡æ¶æDjangoãFlaskåTornadoï¼è¦è®ºè¿ä¸ä¸ªWebæ¡æ¶åªä¸ªæ´å¥½çè¯ï¼å»ºè®®ä¸ç¹ï¼Django帮æ们äºå æ建äºå¥½å¤ï¼ä¸æä¼å¿«ä¸äºï¼å¦ä¹ çè¯å¯ä»¥å ä»Djangoå¦èµ·ï¼ç¶ååå¦ä¹ FlaskåTornadoï¼ä¸é¢æ们就æ¥å ·ä½äºè§£ä¸ä¸Pythonä¸å¤§webæ¡æ¶ç详æ ã
1ãDjango
Djangoæ¯ä¸ä¸ªå¼æ¾æºä»£ç çWebåºç¨æ¡æ¶ï¼ç±Pythonåæãéç¨äºMTVçæ¡æ¶æ¨¡å¼ï¼å³æ¨¡åMï¼æ¨¡æ¿Tåè§å¾Vãå®æåæ¯è¢«å¼åæ¥ç¨äºç®¡çå³ä¼¦æ¯åºçéå¢æä¸çä¸äºä»¥æ°é»å 容为主çç½ç«çï¼å³æ¯CMS(å 容管çç³»ç»)软件ã
2ãFlask
Flaskæ¯ä¸ä¸ªä½¿ç¨Pythonç¼åçè½»é级Webåºç¨æ¡æ¶ãå ¶WSGIå·¥å ·ç®±éç¨Werkzeugï¼æ¨¡æ¿å¼æå使ç¨Jinja2
ãFlask使ç¨BSDææã
Flaskä¹è¢«ç§°ä¸ºâmicroframeworkâï¼å 为å®ä½¿ç¨ç®åçæ ¸å¿ï¼ç¨extension
å¢å å ¶ä»åè½ãFlask没æé»è®¤ä½¿ç¨çæ°æ®åºãçªä½éªè¯å·¥å ·ã
Flaskå¾è½»ï¼è±å¾å°çææ¬å°±è½å¤å¼åä¸ä¸ªç®åçç½ç«ãé常éååå¦è å¦ä¹ ãFlaskæ¡æ¶å¦ä¼ä»¥åï¼å¯ä»¥èèå¦ä¹ æ件ç使ç¨ãä¾å¦ä½¿ç¨WTForm+
Flask-WTFormæ¥éªè¯è¡¨åæ°æ®ï¼ç¨SQLAlchemy+Flask-SQLAlchemyæ¥å¯¹ä½ çæ°æ®åºè¿è¡æ§å¶ã
3ãTornado
Tornadoæ¯ä¸ç§Webæå¡å¨è½¯ä»¶çå¼æºçæ¬ãTornadoåç°å¨ç主æµWebæå¡å¨æ¡æ¶(å æ¬å¤§å¤æ°Python
çæ¡æ¶)æçææ¾çåºå«ï¼å®æ¯éé»å¡å¼æå¡å¨ï¼èä¸é度ç¸å½å¿«ã
å¾å©äºå ¶éé»å¡çæ¹å¼å对epollçè¿ç¨ï¼Tornadoæ¯ç§å¯ä»¥å¤çæ°ä»¥å计çè¿æ¥ï¼å æ¤Tornadoæ¯å®æ¶Webæå¡çä¸ä¸ª
çæ³æ¡æ¶ã
å ³äºPythonä¸å¤§webæ¡æ¶çç®åä»ç»ï¼å°±ç»å¤§å®¶å享å°è¿éäºï¼å½ç¶å¦ä¹ æ¯æ°¸æ æ¢å¢çï¼å¦ä¹ ä¸é¡¹æè½æ´æ¯åçç»èº«ï¼æ以ï¼åªè¦è¯åªåå¦ï¼ä»ä¹æ¶åå¼å§é½ä¸æï¼å¸æ大家æç´§æ¶é´è¿è¡å¦ä¹ å§ã
web.pyä¸djangoï¼é£ä¸ªæ´å¥½ï¼
ä¸ç¥éä½ è¦åä»ä¹ç±»åçåºç¨ãweb.pyæ¯è½»é级没éï¼djangoä¹ä¸è§å¾æå¤ééãä½æ¯ådjangoå¼åï¼åªè¦ä½ ç¨å°æ°æ®åºï¼ä½ ä¼è§å¾ååæ¹ä¾¿ãè³äºè¯´è¦æ¹å¨çå æ ¸å¤ï¼ä¸è¬çç½ç»åºç¨ç¨åºï¼ç»å¯¹ä¸éè¦ä½ å»æ¹ä»ä¹å æ ¸ãè³å°å°ç®å为æ¢ï¼æèªå·±è¿æ²¡æ碰å°è¦æ¹å æ ¸çæ åµãè¯è¯´å¦æä½ çæ°´å¹³é«å°è½æ¹å æ ¸çç¨åº¦äºï¼ä¹å°±ä¸éè¦åçº ç»äºè¿ä¸ªé®é¢äºï¼èªå·±é½å¯ä»¥åä¸ä¸ªæ¡æ¶äºã
个人认为djangoæ¯ç¸å½å¹³è¡¡èå好ç¨çãæ¯å¦è¯´djangoçModelåTemplateï¼ä½ æ¢å¯ä»¥ç¨ï¼ä¹å¯ä»¥ä¸ç¨ï¼æ²¡æ说ä¸å®å¼ºè¿«ä½ ç¨ãæ以说djangoæ¯éé级çï¼ä¼°è®¡ä¹æ¯ä¸ç¥å解ã
åä¸è¬çç½ç»åºç¨ï¼å¼ºç建议使ç¨django.
pythonæ建ç½ç«åcmsæ建ç½ç«åªä¸ªæ´å¿«ï¼åæä½ä¼å¿DjangoCMSæ¯åºäºDjangoçï¼whichisåºäºPythonçã
CMSæ¯ä¸ä¸ªç¸å½å®æ´ãå¯éè¿ç®¡ççé¢è¿è¡é ç½®çç½ç«ç³»ç»ï¼ä¸è¬èè¨é¢åéç¨åºåãé¤äºä»åå°å表æç« ãæµè§è¯è®ºä¹å¤ï¼ç¨æ·å¯ä»¥å¨CMSæä¾çèå´å è¿è¡å®å¶åï¼DjangoCMSï¼WordPressæè Ploneä¹ç±»é½å±äºCMSã
CMSä¹ä¸æ¯æè°ãWebæ¡æ¶ããPythonæDjangoï¼PHPæYiiçãè¿äºæ¡æ¶é¢åçæ¯ç¨åºåï¼æä¾äºæ建ç½ç«ç大éå¿ è¦å·¥å ·ï¼ä½è¿æ¯å¾ç¨åºåæå·¥æ¼è£ èµ·æ¥æè½ä½¿ç¨ãå¦æéè¦è®©è¯¸å¦ç¼è¾çéææ¯äººå使ç¨è¿ä¸ªç³»ç»ï¼ç¨åºåè¿éè¦æä¾ä¸ä¸ªç±»ä¼¼ä¸è¿°CMSé¨ååè½çåå°æ¥å£ã
åå¾ä¸ï¼æè°ãæåãç½é¡µï¼åºæ¬å°±åªæPHPæåå¨äºï¼å ¶å®æ¨¡å¼ç¸ä¼¼çä¸å¤ææ¯ï¼å¦JSPåASPæä¼ ç»PerlCGIçåºæ¬é½å·²ç»æ¶å¤±äºï¼ã
ä¸è¬æ¥è¯´ï¼å¦æä¸ä¸ªCMSçåè½å¤§ä½æ»¡è¶³äºç½ç«çéæ±ï¼åç´æ¥ç¨è¿ä¸ªCMS就好ï¼å°çæ©å±å个æ件å¯ä»¥è§£å³ã
å¦æç½ç«çéæ±ä¸ç°æCMSæä¾çåè½å¹¶ä¸è¿å¤éåï¼æè åç°CMSå®ç°æäºç¹å®çä¿®æ¹é常å°é¾ï¼æ¯å¦æ¬èº«æ¥å£æä¾çå¾å·®ï¼æè 代ç ãæ档质éå¦ç¿ä¸æ ·ï¼æè è¯è¨ééäºï¼æ¯å¦Drupalï¼ï¼ååºäºä¸ä¸ªææ¡£ã代ç è´¨é好ï¼è¯è¨åéï¼æ¯å¦Pythonï¼çæ¡æ¶è¿è¡æ建ï¼å¨åæçç»´æ¤æ¹é¢ä¼å¿ä¼æ´å¤§ä¸äºã
å ¶å®è¯´å°åºææ¯éåè¿æ¯åºäºå¢éï¼ééæ人çæWordPressçï¼ç¨wp就对äºã
webå¼åä¸åªä¸ªå端è¯è¨å¼åæçæé«JavaScript
æç §å½åçæµè¡è¶å¿æ¥çï¼JavaScriptæ¯ä¸é¨æ§ä»·æ¯é常é«çè¯è¨ãå 为åªè¦æ¯Webï¼å°±ä¼æå端ï¼åªè¦æå端ï¼å°±éè¦æJavaScriptãä¸æ¤åæ¶ï¼Node.jså¨åå°ä¸çå°ä½å·²ç»æåéè¦äºã对ä¸è¬ç项ç®èè¨ï¼å¯ä»¥ä½¿ç¨å®æ¥å®æå端ååå°ï¼é¤æ¤ä¹å¤ï¼è¿æ移å¨åºç¨ã
å¨é£äºå¯ä»¥ä½¿ç¨æµè§å¨æ¥è¿è¡ç设å¤ä¸ï¼æ们é½å¯ä»¥ä½¿ç¨JavaScriptæ¥å¼å使ç¨ï¼ä¾å¦ï¼
使ç¨Node.jsä½ä¸ºåå°è¯è¨ï¼ExpressãKoaçä½ä¸ºåå°MVCæ¡æ¶ï¼åéæ©ä¸ä¸ªå端æ¡æ¶æ¥å®ç°åå°ã
使ç¨åºäºæµè§å¨å æ ¸çæ¡é¢åºç¨Electronï¼å ä¸Node.jsçæç³»ç»éç模åæ¥å®ç°æ¡é¢åºç¨ã
使ç¨æ··ååºç¨ç§»å¨æ¡æ¶Cordovaï¼æ··ååºç¨æ¡æ¶Ionicæ¥å®ç°è·¨å¹³å°ç移å¨åºç¨ã
使ç¨TesselåRuffç硬件æ¥å¼å移å¨åºç¨ã
人们使ç¨WebViewåJavaScriptæ¥å¼ååºç¨çå¾å¤§ä¸é¨ååå æ¯ææ¬æ¯è¾ä½ãé¤äºå¯ä»¥é«æå°å¼åUIï¼è¿æ¯æ跨平å°è¿è¡ï¼å³åªéè¦ç¼åä¸æ¬¡ä»£ç å°±å¯ä»¥å¨ä¸åçæä½ç³»ç»ä¸è¿è¡ï¼å¹¶ä¸å½åºç¨å¯¹æ§è½è¦æ±ä¸é«æ¶ï¼åªè¦éå½å°ä¼åï¼å®å°±å¯ä»¥è¡¨ç°å¾ç¸å½ä¸éã
å¨è¿é¨è¯è¨éï¼æ两个åå°MVCæ¡æ¶æ¯è¾æµè¡ã
Expressï¼æ¯å¨Node.jsä¸ææ©çMVCæ¡æ¶ï¼å®ç±Rubyä¸çè½»é级æ¡æ¶Sinatraå¯åèæ¥çãå ¶æ¡æ¶æ¬èº«å°è£ äºå¤§éå®ç¨çåè½ï¼æ ¸å¿ç¹æ§æ¯ä½¿ç¨ä¸é´ä»¶æ¥å¤çHTTP请æ±ã
Koaï¼æ¯ç±Expressçæ ¸å¿å¼åè åºäºES6æ°ç¹æ§æé çæ°æ¡æ¶ãä¸Expressç¸æ¯ï¼å»é¤äºä¸äºæ¡æ¶èªå¸¦çåè½ï¼æ´å è½»é级ï¼å¯ä»¥è®©å¼åè ææ´å¤çéæ©ã
å½ç¶ï¼è¿ä¹æå³çéè¦ç¨æ·èªå·±å»æ建è¿äºç¯å¢ã
ç®å对æ¯ä¸ä¸ä¸¤è ï¼Expressåå±å¾æ¯è¾æ©ï¼å ¶çæç³»ç»æ¯è¾ä¸°å¯ï¼å¾å®¹ææ¾å°æéè¦çæ件ãKoaååºäºES6è¯è¨å¸¦æ¥ä¸äºæ°çç¹æ§ï¼å®æ¶è§£å³æ§è¯è¨çä¸äºé®é¢ï¼å¦åè°çã
Python
Pythonè¯çå¾æ¯è¾æ©ï¼å ¶è¯è¨ç¹æ§æ¯åäºæ åªæä¸ç§æ¹æ³ï¼è¿ä¸ªç¹ç¹ä¹å³å®äºè¿é¨è¯è¨å¾ç®åãä¸JavaScriptç¸æ¯ï¼å®ä»æ¯ä¸é¨æ§ä»·æ¯é常é«çè¯è¨ï¼åªæ¯å®ä¸è½å¨å端è¿è¡ã
Pythonæ¯ä¸é¨ç®æ´çè¯è¨ï¼æ大éçæ°å¦ãç§å¦å·¥å ·ã人工æºè½çåºï¼è¿æå³çå¨ä¸è¿çå°æ¥å®ä¼åæ¥æ´å¤§çä½ç¨ãåæ¶å¨Webå¼åé¢åä¹æ广æ³çåºç¨ï¼é¤äºæ£å¸¸çWebå¼åï¼å®è¿å¨ç½ç»ç¬è«ä¸å¹¿å欢è¿ã
åæ ·ï¼å¨Pythonè¯è¨éä¹æ两个ä¸éçæ¡æ¶å¯ä»¥éæ©ï¼å ¶ä¸çDjangoæ¯éé级æ¡æ¶ï¼Flaskåæ¯è½»é级æ¡æ¶ã
Djangoï¼ææ©æ¯è¢«åºç¨äºå 容管çç³»ç»èå¼åçï¼å ¶æ¡æ¶éèªå¸¦äºç¸å½å¤çç»ä»¶ï¼ORMã表ååºåååéªè¯ç³»ç»ãåå°ç³»ç»ãç¼åæ¡æ¶ãä¸é´ä»¶æ¯æçãå¨å ¶å®ç½ä¸å®£ç§°æ¯ï¼TheWebframeworkforperfectionistswithdeadlinesï¼å®æ¢å¯ä»¥æ»¡è¶³å®ç¾ä¸»ä¹è ï¼åå¯ä»¥å¨æªæ¢æéå交ä»è½¯ä»¶ã
Flaskï¼æ¯ä¸ä¸ªè½»é级çæ¡æ¶ï¼å®åªæç®åçæ ¸å¿é¨åãæ¢å¥è¯è¯´ï¼ä½ å¯ä»¥æèªå·±çéè¦æ·»å ORMãç¨æ·è®¤è¯ãæ件ä¸ä¼ çåè½ãå¨ä»å¤©æ¥çï¼å®ççæç³»ç»ä¹ç¸å½ä¸°å¯ï¼å¯ä»¥å®æç»å¤§é¨ååè½ã
éæ©Flaskèä¸æ¯éæ©Djangoçåå æ¯ï¼Djangoæ¬èº«è§å®å¥½äºä¸ç³»åçè§èåä¹ æ¯ã
å èå¨ç¼ç¨æ¶ï¼æ们åªéè¦ææ¥éª¤ä¸æ¥æ¥å¾ä¸èµ°å³å¯ã
æ¬ä¹¦éç¨Djangoä½ä¸ºWebå¼åæ¡æ¶ç主è¦åå æ¯ï¼å®éåä½ä¸ºCMSæ¡æ¶ï¼å¹¶ä¸æä¾äºä¸°å¯çç»ä»¶åè½ï¼å¦ç¨æ·æé管çãèªå¸¦åå°ç®¡çç³»ç»ãORMçã
Java
å¨ä»å¤©çæ¥ï¼Javaä»ç¶åä¼ä¸æ¬¢è¿ï¼é¤äºå¨ä¼ä¸çº§Webç³»ç»å¼åä¸ï¼å®è¿å¨Androidåºç¨çå¼åä¸ç»½æ¾å 彩ã
å¨æ ¡æé´ï¼ç¬è ä¸ç¹å¿ä¹ä¸å欢Javaãåæ¥æåç°ï¼æä»Javaä¸å¦å°çä¸è¥¿æ¯ä»å ¶ä»è¯è¨ä¸å¦çä¸è¥¿è¿å¤ãå¦æOracleä¸æ¯åJavaï¼é£ä¹å®ä¼ç»§ç»åæ´»å¾ä¹ ãæå¯ä»¥ç¨JavaScripté åºåç§ææ³è¦çä¸è¥¿ï¼ä½æ¯é常ææ æ³ä¿è¯å®ä»¬æ¯ä¼é å°å®ç°ãè¿å»äººä»¬å¨Javaä¸è±è´¹äºå¾å¤æ¶é´ï¼æå¨æ¶æä¸ï¼æå¨è¯è¨ä¸ï¼æå¨æ¨¡å¼ä¸ãç±äºè¿äºæå ¥ï¼é½ç»äºäººä»¬å¾å¤å¯åãè¿äºé½å¯ä»¥ç¨äºæ°çè¯è¨åæ°ç设计ï¼æ¯ç«æ²¡æä»ä¹ææ¯æ¯ç¬ç«äºæ§çææ¯äº§ççã
ç±äºå¨Javaè¯è¨éï¼ç¬è 主è¦æ¥è§¦çæ¯Springæ¡æ¶ï¼å æ¤ä¸é¢è®¨è®ºä¸ä¸Springã
SpringMVCï¼æ¯ç±Springæ¡æ¶æä¾çæ建Webåºç¨ç¨åºçå ¨åè½MVC模åãç±äºæ¡æ¶æ¬èº«é«åº¦å¯é ç½®ï¼å³å¯ä»¥ç´æ¥ä½¿ç¨ç¼åXMLèä¸æ¯Javaæ¥å®ç°åè½ãå®æ¯ä¸ä¸ªå ¸åçMVCæ¡æ¶ï¼å¹¶ä¸ä¹æ¯ä¸ä¸ªçº¯æ£çservletç³»ç»ã
SpringBootï¼å ¶ä½ç¨å¨äºå建åå¯å¨æ°çåºäºSpringæ¡æ¶ç项ç®ãç³»ç»æ¬èº«å好äºå¯¹ä¸åæ¡æ¶çé ç½®ä¸éæï¼æ们åªéè¦å¯¹å ¶é ç½®ï¼å¹¶ç¼åå°éç代ç å³å¯ã
å¦æä½ æ£å¨èè使ç¨Springæ¡æ¶ï¼å»ºè®®ä½¿ç¨SpringBootã
PHP
PHPæ¯ä¸é¨å¾å®¹æä¸æçè¯è¨ï¼ç±äºå ¶å®¹æä¸æï¼å¹¶ä¸åå±å¾æ¯è¾æçãå æ¤ï¼æç¸å¤å½ç个人ç½ç«ä½¿ç¨å®ä½ä¸ºå¼åè¯è¨ï¼å¦Facebookè¿æ ·å¤§æµéçç½ç«ä¹å¨ä½¿ç¨å®ãå¦å¤ï¼ä¸å¾ä¸æåçæ¯WordPresså·²ç»å é¢äºCMSå¸åºè¶ è¿ä¸åç份é¢ï¼å¹¶ä¸å®ä¹å é¢äºå ¨çç½ç«çååä¹ä¸ãWordPressåçæ¯ä¸ºå客系ç»èå建çå¼æºæ¡æ¶ï¼ç±äºå客系ç»åå 容管çç³»ç»å¨åè½ä¸å¾å¤æ¯ç¸ä¼¼çï¼å æ¤å®æäºæå ·ç¥å度çå 容管çç³»ç»ï¼contentmanagementsystemCMSï¼ã
å¨è¿é并ä¸åºäºWordPressæ¥å¼åå 容管çç³»ç»ï¼å 为å®å·²ç»æ¯ä¸ä¸ªç¸å½æççæ¡æ¶äºãå¦æä½ éè¦ä¸ä¸ªå客系ç»æè å 容管çç³»ç»ï¼é¦éWordPressï¼ç¶åææ¯èªå·±ç¼åã
PHPå¨æ¡æ¶æ¹é¢ææ¯è¾å¤çéæ©ï¼éæ¾çæ¯ï¼ç¬è åªå¯¹Laravelæ¯è¾äºè§£ãå®æ¯å¨PHP5.3ä¹åå¼åçæ°æ¡æ¶ï¼å ¶ç±»ä¼¼äºRubyonRailsâ为PHPç¨åºåæä¾å¿«éå¼åçæºå¶âæä¾å¿«éå¼åçå·¥å ·éï¼å¦çæ代ç ãæ°æ®è¿ç§»ãORMçã
Ruby
Rubyæ¯ä¸é¨ä¼ç¾èå·§å¦çè¯è¨ï¼å®å¯ä»¥ä½¿ç¼ååºæ¥ç代ç çä¸å»æ´èªç¶ãç®æ´ï¼æ´å ·æ表达åï¼å æ¤æ·±åç¨åºå欢è¿ãæ©æRubyè¯è¨çåºç¨åºæ¯ç¹å«å°ï¼ç´è³RubyOnRailsçåºç°ãå®æ¯ä¸¥æ ¼æç §MVCç»æå¼åçWebå¼æºæ¡æ¶ï¼å ¶è´åäºæåç¨åºåçå¿«ä¹æåç产æçâå¿«éå建页é¢ã模æ¿åæ¥è¯¢åè½çãä¸è¿å¦ä»ç±äºå¯ç»´æ§åæ§è½çé®é¢ï¼å®æ£å¨éæ¸è¢«æ¿æ¢ãåªæ¯å¯¹ååå ¬å¸æ¥è¯´ï¼å®çå¼åæçä»ä½¿å¾å®æ¯ä¸ä¸ªä¸éçéæ©ï¼éåå¨ä¸å¡ç¨³å®å使ç¨å ¶ä»æ¡æ¶æ¥æ¿æ¢ã
åæ ·ï¼ç±äºRubyOnRailsæ¯ä¸ä¸ªéé级çéæ©ï¼Rubyç¨åºåä¹æ¨åºäºèªå·±çè½»é级æ¡æ¶Sinatraãå®æ¯ä¸ä¸ªåºäºRubyè¯è¨çDSLï¼é¢åä¸å±è¯è¨ï¼ï¼ç±äºå ¶ä»£ç è¡æ°å°ï¼ä¸ç®åãç®æ´ï¼å¯ä»¥å¾å®¹ææ·±å ¥ç解æ¡æ¶å¹¶å¯¹å ¶ååºå®å¶
ç¶åå°±æ¯ç项ç®éè¦ä»¥åå¢éä¼å¿è¿è¡éæ©
PythonæåWordPressè¿æ ·çå¼æºç¨åºä¹pythonçå¼æºç¨åºå¾å¤ï¼é¤äºwordpresså¤è¿æå¦ä¸ï¼
Django:PythonWebåºç¨å¼åæ¡æ¶
Djangoåºè¯¥æ¯æåºåçPythonæ¡æ¶ï¼GAEçè³Erlangé½ææ¡æ¶åå®å½±åãDjangoæ¯èµ°å¤§èå ¨çæ¹åï¼å®æåºåçæ¯å ¶å ¨èªå¨åç管çåå°ï¼åªéè¦ä½¿ç¨èµ·ORMï¼åç®åç对象å®ä¹ï¼å®å°±è½èªå¨çææ°æ®åºç»æã以åå ¨åè½ç管çåå°ã
Dieselï¼åºäºGreenletçäºä»¶I/Oæ¡æ¶
Dieselæä¾ä¸ä¸ªæ´æ´çAPIæ¥ç¼åç½ç»å®¢æ·ç«¯åæå¡å¨ãæ¯æTCPåUDPã
Flaskï¼ä¸ä¸ªç¨Pythonç¼åçè½»é级Webåºç¨æ¡æ¶
Flaskæ¯ä¸ä¸ªä½¿ç¨Pythonç¼åçè½»é级Webåºç¨æ¡æ¶ãåºäºWerkzeugWSGIå·¥å ·ç®±åJinja2模æ¿å¼æãFlaskä¹è¢«ç§°ä¸ºâmicroframeworkâï¼å 为å®ä½¿ç¨ç®åçæ ¸å¿ï¼ç¨extensionå¢å å ¶ä»åè½ãFlask没æé»è®¤ä½¿ç¨çæ°æ®åºãçªä½éªè¯å·¥å ·ã
Cubesï¼è½»é级PythonOLAPæ¡æ¶
Cubesæ¯ä¸ä¸ªè½»é级Pythonæ¡æ¶ï¼å å«OLAPãå¤ç»´æ°æ®åæåæµè§èåæ°æ®ï¼aggregateddataï¼çå·¥å ·ã
Kartograph.pyï¼åé ç¢éå°å¾çè½»é级Pythonæ¡æ¶
Kartographæ¯ä¸ä¸ªPythonåºï¼ç¨æ¥ä¸ºESRIçæSVGå°å¾ãKartograph.pyç®åä»å¤äºbetaé¶æ®µï¼ä½ å¯ä»¥å¨virtualenvç¯å¢ä¸æ¥æµè¯ã
Pulsarï¼Pythonçäºä»¶é©±å¨å¹¶åæ¡æ¶
Pulsaræ¯ä¸ä¸ªäºä»¶é©±å¨ç并åæ¡æ¶ï¼æäºpulsarï¼ä½ å¯ä»¥ååºå¨ä¸åè¿ç¨æ线ç¨ä¸è¿è¡ä¸ä¸ªæå¤ä¸ªæ´»å¨çå¼æ¥æå¡å¨ã
Web2pyï¼å ¨æ å¼Webæ¡æ¶
Web2pyæ¯ä¸ä¸ªä¸ºPythonè¯è¨æä¾çå ¨åè½Webåºç¨æ¡æ¶ï¼æ¨å¨ææ·å¿«éçå¼åWebåºç¨ï¼å ·æå¿«éãå®å ¨ä»¥åå¯ç§»æ¤çæ°æ®åºé©±å¨çåºç¨ï¼å ¼å®¹GoogleAppEngineã
Falconï¼æ建äºAPIåç½ç»åºç¨å端çé«æ§è½Pythonæ¡æ¶
Falconæ¯ä¸ä¸ªæ建äºAPIçé«æ§è½Pythonæ¡æ¶ï¼å®é¼å±ä½¿ç¨RESTæ¶æé£æ ¼ï¼å°½å¯è½ä»¥æå°çåæ°åæå¤çäºæ ã
Dparkï¼PythonççSpark
DParkæ¯SparkçPythonå éï¼æ¯ä¸ä¸ªPythonå®ç°çåå¸å¼è®¡ç®æ¡æ¶ï¼å¯ä»¥é常æ¹ä¾¿å°å®ç°å¤§è§æ¨¡æ°æ®å¤çåè¿ä»£è®¡ç®ãDParkç±è±ç£å®ç°ï¼ç®åè±ç£å é¨çç»å¤§å¤æ°æ°æ®åæé½ä½¿ç¨DParkå®æï¼æ£æ¥è¶å®åã
Buildbotï¼åºäºPythonçæç»éææµè¯æ¡æ¶
Buildbotæ¯ä¸ä¸ªå¼æºæ¡æ¶ï¼å¯ä»¥èªå¨å软件æ建ãæµè¯ååå¸çè¿ç¨ãæ¯å½ä»£ç ææ¹åï¼æå¡å¨è¦æ±ä¸åå¹³å°ä¸ç客æ·ç«¯ç«å³è¿è¡ä»£ç æ建åæµè¯ï¼æ¶é并æ¥åä¸åå¹³å°çæ建åæµè¯ç»æã
Zerorpcï¼åºäºZeroMQçé«æ§è½åå¸å¼RPCæ¡æ¶
Zerorpcæ¯ä¸ä¸ªåºäºZeroMQåMessagePackå¼åçè¿ç¨è¿ç¨è°ç¨åè®®ï¼RPCï¼å®ç°ãåZerorpcä¸èµ·ä½¿ç¨çServiceAPI被称为zeroserviceãZerorpcå¯ä»¥éè¿ç¼ç¨æå½ä»¤è¡æ¹å¼è°ç¨ã
Bottle:å¾®åPythonWebæ¡æ¶
Bottleæ¯ä¸ä¸ªç®åé«æçéµå¾ªWSGIçå¾®åpythonWebæ¡æ¶ã说微åï¼æ¯å 为å®åªæä¸ä¸ªæ件ï¼é¤Pythonæ ååºå¤ï¼å®ä¸ä¾èµäºä»»ä½ç¬¬ä¸æ¹æ¨¡åã
Tornadoï¼å¼æ¥éé»å¡IOçPythonWebæ¡æ¶
Tornadoçå ¨ç§°æ¯ToradoWebServerï¼ä»ååä¸çå°±å¯ç¥éå®å¯ä»¥ç¨ä½Webæå¡å¨ï¼ä½åæ¶å®ä¹æ¯ä¸ä¸ªPythonWebçå¼åæ¡æ¶ãæåæ¯å¨FriendFeedå ¬å¸çç½ç«ä¸ä½¿ç¨ï¼FaceBookæ¶è´äºä¹å便å¼æºäºåºæ¥ã
webpy:è½»é级çPythonWebæ¡æ¶
webpyç设计ç念åæ±ç²¾ç®ï¼Keepitsimpleandpowerfulï¼ï¼æºç å¾ç®çï¼åªæä¾ä¸ä¸ªæ¡æ¶æå¿ é¡»çä¸è¥¿ï¼ä¸ä¾èµå¤§éç第ä¸æ¹æ¨¡åï¼å®æ²¡æURLè·¯ç±ã没æ模æ¿ä¹æ²¡ææ°æ®åºç访é®ã
Scrapyï¼Pythonçç¬è«æ¡æ¶
Scrapyæ¯ä¸ä¸ªä½¿ç¨Pythonç¼åçï¼è½»é级çï¼ç®å轻巧ï¼å¹¶ä¸ä½¿ç¨èµ·æ¥é常çæ¹ä¾¿ã
ç»è¯ï¼ä»¥ä¸å°±æ¯é¦å¸CTOç¬è®°ä¸ºå¤§å®¶æ´ççå ³äºwordpressådjangoåªä¸ªå¥½çå ¨é¨å 容äºï¼æè°¢æ¨è±æ¶é´é 读æ¬ç«å 容ï¼å¸æ对æ¨ææ帮å©ï¼æ´å¤å ³äºwordpressådjangoåªä¸ªå¥½çç¸å ³å 容å«å¿äºå¨æ¬ç«è¿è¡æ¥æ¾åã
Tornado主要特点
Tornado的独特之处在于其灵活的开发工具适用性,无论是码解在应用开发的哪个阶段,还是码解在不同硬件环境下,都能得心应手。码解完整的码解成都 源码时代Tornado工具集使得开发者无需过多考虑连接策略或存储需求,专注于核心开发工作。码解 Tornado结构设计初衷是码解为开发者和第三方工具厂商提供一个开放的平台。已经存在的码解一系列API接口,包括开发环境接口和连接实现,码解为开发者提供了丰富的码解资源和参考文档。 尤其值得一提的码解是,Tornado提供了强大的码解开发和调试工具,如C和C++源码级别的码解调试器、目标和工具管理、码解系统目标跟踪、内存使用分析以及自动配置,这些工具特别适合解决嵌入式开发中的复杂问题,支持高效的协同开发。 VxWorks支持工业标准,如实时扩展的基础前端案例源码POSIX .1b、ANSI C(含浮点支持)以及TCP/IP网络协议,这些标准增强了不同产品间的兼容性,提升了系统的可移植性,保护了用户的开发和培训投资。 VxWorks拥有一个高效的微内核,支持实时系统的多任务、中断管理、抢占式和循环调度等特性。这种设计显著减少了系统开销,加快了对外部事件的英雄联盟项目源码响应。例如,在K处理器上,上下文切换仅需3.8微秒,中断等待时间更是少于3微秒,显示了其运行速度和确定性。 更重要的是,VxWorks的可扩展性非常出色。开发者可以根据应用需求动态分配资源,从最小的嵌入设计到复杂的高端实时应用,它提供了多达种不同的qwtpolar源码编译报错配置选项,供开发者选择。 例如,IBM的rational time realtest就选择了VxWorks作为其开发平台,这进一步证明了VxWorks的强大功能和灵活性。扩展资料
系统内容 TornadoTornado代表嵌入实时应用中最新一代的开发和执行环境。 Tornado 包含三个完整的部分: (1)Tornado系列工具, 一套位于主机或目标机上强大的交互式开发工具和使用程序; (2)VxWorks 系统, 目标板上高性能可扩展的实时操作系统; (3)可选用的连接主机和目标机的通讯软件包 如以太网、串行线、在线仿真器或ROM仿真器。aide手机游戏源码UNIX环境高级编程UNIX网络编程这三本书先看哪个一个?网络编程和web编程疑惑,pythontornado源码学习
接触Python Web开发一年,疑惑丛生,主要涉及进程、线程编程及网络编程。在实际项目中,应如何正确运用进程和线程?对网络编程的深入理解,特别是高性能服务器设计实现,感到困惑,尤其是面对Tornado服务器代码,难以理解。
关于UNIX环境高级编程、UNIX网络编程(卷1、2)这三本书的阅读顺序,应先从基础知识入手。推荐先阅读《图解TCP/IP》一书,把握面向连接与无连接、TCP粘包与UDP有界等核心概念。紧接着,深入学习Linux/Unix系统编程手册中关于socket的章节,这本书以超越apue的讲解方式,对socket、select、poll、epoll等关键概念进行了详细解析,有助于理解并发编程原理。
了解并阅读Tornado源码,这一阶段应较为轻松,因为之前对相关概念和原理已有基础理解。《Effective TCP/IP》一书则提供了更高级的指导,帮助深化对网络编程的理解。最后推荐阅读《UNIX网络编程》(卷1),尽管其内容丰富,但先阶段主要关注其基本网络模型的介绍,如多进程、多线程版本的echo服务器程序、非阻塞web客户端程序等,这有助于初步构建对网络编程的实践认知。
理解高性能服务器的实现,源码阅读是关键。例如,学习lig/facebook/tornado.git
å¨tornadoçåç®å½ä¸ï¼æ¯ä¸ªæ¨¡åé½åºè¯¥æä¸ä¸ª.pyæ件ï¼ä½ å¯ä»¥éè¿æ£æ¥ä»ä»¬æ¥å¤æä½ æ¯å¦ä»å·²ç»ä»ä»£ç ä»åºä¸å®æ´çè¿åºäºé¡¹ç®ãå¨æ¯ä¸ªæºä»£ç çæ件ä¸ï¼ä½ é½å¯ä»¥åç°è³å°ä¸ä¸ªå¤§æ®µè½çç¨æ¥è§£é该模åçdoc stringï¼doc stringä¸ç»åºäºä¸å°ä¸¤ä¸ªå ³äºå¦ä½ä½¿ç¨è¯¥æ¨¡åçä¾åã
IOLoop模å
让æ们éè¿æ¥çioloop.pyæ件ç´æ¥è¿å ¥æå¡å¨çæ ¸å¿ãè¿ä¸ªæ¨¡åæ¯å¼æ¥æºå¶çæ ¸å¿ãå®å å«äºä¸ç³»åå·²ç»æå¼çæ件æ述符ï¼è¯è ï¼ä¹å°±æ¯æ件æéï¼åæ¯ä¸ªæ述符çå¤çå¨ï¼handlersï¼ãå®çåè½æ¯éæ©é£äºå·²ç»åå¤å¥½è¯»åçæ件æ述符ï¼ç¶åè°ç¨å®ä»¬åèªçå¤çå¨ï¼ä¸ç§IOå¤è·¯å¤ç¨çå®ç°ï¼å ¶å®å°±æ¯socketä¼å¤IO模åä¸çselect模åï¼å¨Javaä¸å°±æ¯NIOï¼è¯è 注ï¼ã
å¯ä»¥éè¿è°ç¨add_handler()æ¹æ³å°ä¸ä¸ªsocketå å ¥IO循ç¯ä¸ï¼
def add_handler(self, fd, handler, events):
"""Registers the given handler to receive the given events for fd."""
self._handlers[fd] = handler
self._impl.register(fd, events | self.ERROR)
_handlersè¿ä¸ªåå ¸ç±»åçåéä¿åçæ件æ述符ï¼å ¶å®å°±æ¯socketï¼è¯è 注ï¼å°å½è¯¥æ件æ述符åå¤å¥½æ¶éè¦è°ç¨çæ¹æ³çæ å°ï¼å¨Tornadoä¸ï¼è¯¥æ¹æ³è¢«ç§°ä¸ºå¤çå¨ï¼ãç¶åï¼æ件æ述符被注åå°epollï¼unixä¸çä¸ç§IO轮询æºå¶ï¼è²ä¼¼ï¼è¯è 注ï¼å表ä¸ãTornadoå ³å¿ä¸ç§ç±»åçäºä»¶ï¼æåçå¨æ件æè¿°ä¸çäºä»¶ï¼è¯è 注ï¼ï¼READï¼WRITE å ERRORãæ£å¦ä½ æè§ï¼ERRORæ¯é»è®¤ä¸ºä½ èªå¨æ·»å çã
self._implæ¯select.epoll()åselet.select()两è ä¸çä¸ä¸ªãæ们ç¨åå°çå°Tornadoæ¯å¦ä½å¨å®ä»¬ä¹é´è¿è¡éæ©çã
ç°å¨è®©æ们æ¥ççå®é ç主循ç¯ï¼ä¸ç¥ä½æ ï¼è¿æ®µä»£ç 被æ¾å¨äºstart()æ¹æ³ä¸ï¼
def start(self):
"""Starts the I/O loop.
The loop will run until one of the I/O handlers calls stop(), which
will make the loop stop after the current event iteration completes.
"""
self._running = True
while True:
[ ... ]
if not self._running:
break
[ ... ]
try:
event_pairs = self._impl.poll(poll_timeout)
except Exception, e:
if e.args == (4, "Interrupted system call"):
logging.warning("Interrupted system call", exc_info=1)
continue
else:
raise
# Pop one fd at a time from the set of pending fds and run
# its handler. Since that handler may perform actions on
# other file descriptors, there may be reentrant calls to
# this IOLoop that update self._events
self._events.update(event_pairs)
while self._events:
fd, events = self._events.popitem()
try:
self._handlers[fd](fd, events)
except KeyboardInterrupt:
raise
except OSError, e:
if e[0] == errno.EPIPE:
# Happens when the client closes the connection
pass
else:
logging.error("Exception in I/O handler for fd %d",
fd, exc_info=True)
except:
logging.error("Exception in I/O handler for fd %d",
fd, exc_info=True)
poll()æ¹æ³è¿åä¸ä¸ªå½¢å¦(fd: events)çé®å¼å¯¹ï¼å¹¶èµå¼ç»event_pairsåéãç±äºå½ä¸ä¸ªä¿¡å·å¨ä»»ä½ä¸ä¸ªäºä»¶åçåå°æ¥æ¶ï¼Cå½æ°åºä¸çpoll()æ¹æ³ä¼è¿åEINTRï¼å®é æ¯ä¸ä¸ªå¼ä¸º4çæ°å¼ï¼ï¼æ以"Interrupted system call"è¿ä¸ªç¹æ®çå¼å¸¸éè¦è¢«æè·ãæ´è¯¦ç»ç请æ¥çman pollã
å¨å é¨çwhile循ç¯ä¸ï¼event_pairsä¸çå 容被ä¸ä¸ªä¸ä¸ªçååºï¼ç¶åç¸åºçå¤çå¨ä¼è¢«è°ç¨ãpipe å¼å¸¸å¨è¿éé»è®¤ä¸è¿è¡å¤çã为äºè®©è¿ä¸ªç±»éåºæ´ä¸è¬çæ åµï¼å¨httpå¤çå¨ä¸å¤çè¿ä¸ªå¼å¸¸æ¯ä¸ä¸ªæ´å¥½çæ¹æ¡ï¼ä½æ¯éæ©ç°å¨è¿æ ·å¤çæ许æ¯å 为æ´å®¹æä¸äºã
注éä¸è§£éäºä¸ºä»ä¹ä½¿ç¨åå ¸çpopitem()æ¹æ³ï¼èä¸æ¯ä½¿ç¨æ´æ®éä¸ç¹çä¸é¢è¿ç§åæ³ï¼æ使ç¨è¿ä»£ï¼è¯è 注ï¼ï¼
for fd, events in self._events.items():
åå å¾ç®åï¼å¨ä¸»å¾ªç¯æé´ï¼è¿ä¸ª_eventsåå ¸åéå¯è½ä¼è¢«å¤çå¨æä¿®æ¹ãæ¯å¦remove_handler()å¤çå¨ãè¿ä¸ªæ¹æ³æfdï¼å³æ件æ述符ï¼è¯è 注ï¼ä»_eventsåå ¸ä¸ååºï¼extractsï¼æææ¯ååºå¹¶ä»_eventsä¸å é¤ï¼è¯è 注ï¼ï¼æ以å³ä½¿fd被éæ©å°äºï¼å®çå¤çå¨ä¹ä¸ä¼è¢«è°ç¨ï¼ä½è çæææ¯ï¼å¦æ使ç¨forè¿ä»£å¾ªç¯_eventsï¼é£ä¹å¨è¿ä»£æé´_eventså°±ä¸è½è¢«ä¿®æ¹ï¼å¦åä¼äº§çä¸å¯é¢è®¡çé误ï¼æ¯å¦ï¼ææè°ç¨äºremove_handler()æ¹æ³å é¤äºæ个<fd, handler>é®å¼å¯¹ï¼ä½æ¯è¯¥handlerè¿æ¯è¢«è°ç¨äºï¼è¯è 注ï¼ã