1. Python是什麼?php
1.1. Python語言html
1.2. Python哲學前端
2. Python在工做中的應用java
2.1. 實例1:文件批量處理node
2.2. 實例2:xml與excel互轉python
2.3. 總結nginx
3. 爲何選擇Python?git
3.1. 前途!錢途!github
3.2. 開發效率極高web
3.3. 總而言之
4. 還有誰在用Python?
4.1. 國外
4.2. 國內
5. 是否是想學習Python了?
入門資料
工具
可能有些標題黨,沒有針對某些具體的應用與實踐。有哪些補充、不足請你們指出。
Life is short, You need python
生命苦短,我用Python
Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言,具備20多年的發展歷史,成熟且穩定。Python具備如下特色(摘自《A Byte of Python》,中譯名《簡明Python教程》):
l 簡單:Python是一種表明簡單主義思想的語言。閱讀一個良好的Python程序就感受像是在讀英語同樣。它使你可以專一於解決問題而不是去搞明白語言自己。
l 易學:Python極其容易上手,由於Python有極其簡單的。
l 免費、開源。
l 高層語言:用Python語言編寫程序的時候無需考慮諸如如何管理你的程序使用的內存一類的底層細節。
l 可移植性:因爲它的開源本質,Python已經被移植在幾乎全部平臺上(通過改動使它可以工做在不一樣平臺上)。
l 解釋性:Python解釋器把源代碼轉換成稱爲字節碼的中間形式,而後再把它翻譯成計算機使用的機器語言並運行。這使得使用Python更加簡單。也使得Python程序更加易於移植。
l 面向對象:Python既支持面向過程的編程也支持面向對象的編程。在「面向過程」的語言中,程序是由過程或僅僅是可重用代碼的函數構建起來的。在「面向對象」的語言中,程序是由數據和功能組合而成的對象構建起來的。
l 可擴展性:若是須要一段關鍵代碼運行得更快或者但願某些算法不公開,能夠部分程序用C或C++編寫,而後在Python程序中使用它們。(膠水語言)
l 可嵌入性:能夠把Python嵌入C/C++程序,從而向程序用戶提供腳本功能。
l 豐富的庫:Python標準庫確實很龐大。它能夠幫助處理各類工做,包括正則表達式、文檔生成、單元測試、線程、數據庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統、GUI(圖形用戶界面)、Tk和其餘與系統有關的操做。這被稱做Python的「功能齊全」理念。除了標準庫之外,還有許多其餘高質量的庫,如wxPython、Twisted和Python圖像庫等等。
下面簡單介紹下幾個關鍵版本:
l 在1989年聖誕節期間的阿姆斯特丹,吉多爲了打發聖誕節的無趣,決心開發一個新的腳本解釋編程。之因此選中Python做爲編程的名字,是由於他是一個蒙提·派森的飛行馬戲團的愛好者。
創始人爲吉多·範羅蘇姆(Guido van Rossum)
l Python 2.0於2000年10月16日發佈,主要是實現了完整的垃圾回收,而且支持Unicode。
l Python 3.0於2008年12月3日發佈,此版不徹底兼容以前的Python源代碼。
目前使用最普遍的版本是2.7,最新穩定版本是Python 3.3.1(2013年4月6日)。Django等庫開始支持Python3了,也意味着Python3將成爲主流。
圖:Python哲學
用過 Python的人,基本上都知道在交互式解釋器中輸入 import this 就會顯示 Tim Peters 的 The Zen of Python。(摘自:《Python之禪》的翻譯和解釋,http://goo.gl/1joZU)
The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those! |
翻譯和解釋
Python之禪 by Tim Peters 優美勝於醜陋(Python 以編寫優美的代碼爲目標) 明瞭勝於晦澀(優美的代碼應當是明瞭的,命名規範,風格類似) 簡潔勝於複雜(優美的代碼應當是簡潔的,不要有複雜的內部實現) 複雜勝於凌亂(若是複雜不可避免,那代碼間也不能有難懂的關係,要保持接口簡潔) 扁平勝於嵌套(優美的代碼應當是扁平的,不能有太多的嵌套) 間隔勝於緊湊(優美的代碼有適當的間隔,不要奢望一行代碼解決問題) 可讀性很重要(優美的代碼是可讀的) 即使假借特例的實用性之名,也不可違背這些規則(這些規則至高無上) 不要包容全部錯誤,除非你肯定須要這樣作(精準地捕獲異常,不寫 except:pass 風格的代碼) 當存在多種可能,不要嘗試去猜想 而是儘可能找一種,最好是惟一一種明顯的解決方案(若是不肯定,就用窮舉法) 雖然這並不容易,由於你不是 Python 之父(這裏的 Dutch 是指 Guido ) 作也許好過不作,但不假思索就動手還不如不作(動手以前要細思量) 若是你沒法向人描述你的方案,那確定不是一個好方案;反之亦然(方案測評標準) 命名空間是一種絕妙的理念,咱們應當多加利用(倡導與號召) |
如對文件進行批量重命名,將文件夾中全部的文件名的」scroll_1」替換爲」scroll_00」。
文件批量重命名 |
import os path = 'C:\\Users\\tylerzhu\\Desktop\\icon' for file in os.listdir(path): if os.path.isfile(os.path.join(path,file))==True: newname = file.replace("scroll_1", "scroll_00") os.rename(os.path.join(path,file),os.path.join(path,newname)) print(file) |
Excel,info_fight_monster.xls包含3個sheet,分別表示怪物的基本信息、技能信息、獎勵信息。
XML,info_fight_monster.xml包含怪物的全部信息,格式以下:
<monster attack="84" attrib="2" classId="20" define="37" desc=""frameRate="24" icon="cdn/imageres/pets/pet_56_20.png" level="4" luck="0"monsterSID="1024" name="被馴服的小火猴" skill="74" speed="0" strength="447"type="0" url="cdn/flashres/pets/pet_20.swf"> <skill skillLevel="2" skillSID="30048"/> <skill skillLevel="2" skillSID="30034"/> <prize desc="" gameID="0" infoType="27" itemSID="80001" itemType="0"level="小火猴的魔法棒" name="" num="1" plusSID="400001" prizeSID="1"type="1"/> </monster> |
編寫腳本將Excel轉換爲XML格式。
Excel轉XML |
#! /usr/bin/env python #coding=utf-8 ''' Created on 2013-3-31 將info_fight_monster.xls轉換爲XML格式。轉換分爲如下幾步: step1: 讀取xml文件,info_fight_monster.xls step2: 解析出怪物基本信息,在base這個sheet裏面,並放到一個xml文件中 step3: 解析出怪物的技能信息,並將技能信息插入到對應的xml中 step4:解析出怪物的獎勵信息,並插入到對應XML中 step5:保存xml文件 @author: tylerzhu''' from lxml import etree import xlrd3, codecs
attrib = ["monsterSID", "classId", "type", "level", "attrib", # "attack", "skill", "define", "speed", "strength", # "luck", "name", "desc", "icon", "url", "frameRate"];
prize = ["monsterSID", "prizeSID", "type", "infoType", "gameID", "itemType", # "itemSID", "num", "plusSID", "level", "name", "desc", "icon"];
skill = ["monsterSID", "skillSID", "skillLevel"];
info_fight_monster_xml = etree.ElementTree(etree.Element("data"));
def openxls(): excel = xlrd3.open_workbook("xls/info_fight_monster.xls"); base = excel.sheet_by_name("base"); monster = excel.sheet_by_name("skill"); prize = excel.sheet_by_name("prize"); return (base, monster, prize);
def buildMonsterBase(xls): sheet = xls[0]; for row in range(1, sheet.nrows): monsterAttr = {}; for col in range(0, sheet.ncols): if sheet.cell(row, col).value != None and col < len(attrib): monsterAttr[attrib[col]] = sheet.cell(row, col).value; if type(monsterAttr[attrib[col]]) == float: #print(str(round(monsterAttr[attrib[col]]))) monsterAttr[attrib[col]] = str(round(monsterAttr[attrib[col]])); sub = etree.SubElement(info_fight_monster_xml.getroot(), "monster", monsterAttr); sub.tail = "\n" #input()
def buildMonsterSkill(xls): sheet = xls[1]; for row in range(1, sheet.nrows): skillAttr = {}; for col in range(1, sheet.ncols): if sheet.cell(row, col).value != None and col < len(attrib): skillAttr[skill[col]] = sheet.cell(row, col).value; if type(skillAttr[skill[col]]) == float: skillAttr[skill[col]] = str(round(skillAttr[skill[col]])); monsterSID = str(int(sheet.cell(row, 0).value)); monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']"); monster.text = ("\n\t"); sub = etree.SubElement(monster, "skill", skillAttr); sub.tail = "\n\t"
def buildMonsterPrize(xls): sheet = xls[2]; for row in range(1, sheet.nrows): prizeAttr = {}; for col in range(1, sheet.ncols): if sheet.cell(row, col).value != None and col < len(attrib): prizeAttr[prize[col]] = sheet.cell(row, col).value; if type(prizeAttr[prize[col]]) == float: prizeAttr[prize[col]] = str(round(prizeAttr[prize[col]])); monsterSID = str(int(sheet.cell(row, 0).value)); monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']"); monster.text = ("\n\t"); sub = etree.SubElement(monster, "prize", prizeAttr); sub.tail = "\n\t"
def build(): xls = openxls(); buildMonsterBase(xls); buildMonsterSkill(xls); buildMonsterPrize(xls);
#輸出合併以後的配置 ouput = codecs.open('output/info_fight_monster.xml', 'w', 'utf-8'); ouput.write(etree.tounicode(info_fight_monster_xml.getroot())) ouput.close();
if __name__ == '__main__': build(); |
是否是很簡單!
下面的例子將技能書info_fight_book.xml的數據轉換爲excel格式,例子只包含一個sheet的,若是有多個sheet一樣處理便可。
XML轉Excel |
#! /usr/bin/env python #encoding=utf-8 ''' Created on 2013-5-6 將技能書info_fight_book。xml轉換爲excel格式。 例子只包含一個sheet,若是有多個sheet一樣處理。 @author: tylerzhu ''' from lxml import etree import xlwt3 as xlwt #寫excel標題 #。。。 wb = xlwt.Workbook() ws = wb.add_sheet("技能書")
tree = etree.parse('../xls/info_fight_book.xml') root = tree.getroot() row = 0 col = 0 for item in root: if len(item.attrib) == 0: continue row = row + 1 col = 0 for attr in item.attrib: ws.write(row, col, item.attrib[attr]) col = col + 1
wb.save('../output/技能書.xls') |
經過上面例子,發現Python代碼有如下特色:
l 第一行是特殊形式的註釋:它被稱做 組織行 ——源文件的頭兩個字符是#!,後面跟着一個程序。這行告訴你的Linux/Unix系統當你 執行 你的程序的時候,它應該運行哪一個解釋器。建議使用這種形式——#!/usr/bin/env python,而不是——#!/usr/bin/python。
l 縮進很重要。Python使用縮進而不是一對花括號來劃分語句塊。
l 文檔字符串,__doc__,沒多大用。可是一個好的Python程序,應該要有文檔字符串,且通常遵循:「文檔字符串的慣例是一個多行字符串,它的首行以大寫字母開始,句號結尾。第二行是空行,從第三行開始是詳細的描述。」
l python中引入模塊後(import)首先就要執行模塊的主塊,固然模塊中可能全是函數。若是要避免使用模塊名稱:from 模塊名 import 符號名,那麼使用該符號名就不用使用模塊名+點號+符號名,可是不推薦,容易形成程序不容易讀,並且容易出錯(特別是在python簡潔而簡單的語法的基礎上)import... as ...起一個別名
l 模塊的__name__屬性,至關有用,解決了import的缺點,能夠實現若是不是運行的本模塊而被調用,不調用主塊
l 若是你已經厭煩了java、c++的讀寫文件,那麼python會讓你從新喜歡上文件讀寫,python主張解決問題的方案越少越好,寫文件就一個f = file(name, 'w'),f.write(...)讀文件也同樣,f = file(name),f.read或readline,最後close
l ……
圖:聽說幾年以前,有公司由於提升跳槽門檻而使用Python(摘自:知乎)
上面那截圖只是2玩笑而已:-)。無論怎樣,如今Python已經成爲最受歡迎的程序設計語言之一,徹底不用擔憂這個了。
TIOBE編程語言排行榜,2007、2011兩年被TIOBE編程語言排行榜評爲年度語言。
圖:TIOBE編程語言(2002~2012 Python索引)
PYPL(Popularity of Language Index)編程語言流行指數,它對各類語言的流行指標進行了二次發掘。在過去的十年裏,Python語言得到了最大的增加幅度——十年語言之冠。
圖:編程語言流行指數(http://goo.gl/Nku0I)
聽說豆瓣開發只用了3個月時間就上線了。開發效率高,有如下幾方面緣由。
l String:字符串放在單引號、雙引號、三引號(多行時)中,從0開始索引,支持
n 查:find、index、
n 切片: s[0:2]、s[1:]
n 鏈接:「abc」+「ef」 => 「abcdef」、join
n 分割:split
n 格式化: format
n 。。。大小寫轉換、編碼等操做
l list, []:names=[「Dave」, 「Mark」, 「Ann」],列表從0開始索引,索引元素names[1]。列表能夠包括任意類型的對象,能夠嵌套。支持增、刪、查、分片。
n 增:insert、append
n 刪:del、remove、pop
n 查:search
n 切片: names[0:2]、[1:]
n 鏈接:[1,2,3]+[4,5] => [1,2,3,4,,5]、extend
n 反轉:reverse
l tuple, ():address=(「www.python.org」, 80),a = (80,)。元組語法與list類似,意義至關於枚舉,能夠爲空,若是隻含有一個元素,須要加逗號以區別於表達式(「one」, )。元組建立以後不可修改,即沒法替換、刪除、插入,但支持
n 索引:address[0] => www.python.org
n 切片:address[0:] => ('www.python.org', 80)
n 鏈接:(「www.python.org」,) + (80,) => ('www.python.org', 80)
n host,port=address:host => www.python.org,port => 80
l 字典: dict(), {}:address={"host":"www.python.org", "port":80},支持
n 索引:address[「host」] => 「www.python.org」,
n get:address.get("host") => 「www.python.org」
n 鍵:address.keys() => ['host', 'port']
n in:"host" in address =>True
n 刪除:del address["host"] => {'port': 80}
l 集合:set(),a=set([1,2,3,4]);一個數值集合 b=set(「hello」),一個惟一字符集合。與列表、元組不一樣,集合中的元素是無序的,沒法經過數字索引,且元素不能重複。
n 並集:a|b => set([1, 2, 3, 4, 'h', 'l', 'o', 'e'])
n 交集:a&b => set([])
n 差集:a-b => set([1, 2, 3, 4]),即在a中不在b中元素
n 對稱差集:a^b => set([1, 2, 3, 'e', 'h', 'l', 'o', 4])
n add:a.add(5) => set([1, 2, 3, 4, 5]) #添加一項
n update: a.update([6,7,8]) =>set([1, 2, 3, 4, 5, 6, 7, 8])#添加多項
n remove: a.remove(5) =>set([1, 2, 3, 4, 6, 7, 8])#刪除一項
Python擁有一個強大的標準庫。Python語言的核心只包含數字、字符串、列表、字典、文件等常見類型和函數,而由Python標準庫提供了系統管理、網絡通訊、文本處理、數據庫接口、圖形系統、XML處理等額外的功能。Python標準庫命名接口清晰、文檔良好,很容易學習和使用。
Python標準庫的主要功能有:
若是說強大的標準庫奠基了python發展的基石,豐富的第三方庫則是python不斷髮展的保證,隨着python的發展一些穩定的第三庫被加入到了標準庫裏面。
「There are currently 30630 packages here.」—— https://pypi.python.org/pypi。
用下圖能夠表示Python的強大。
圖:Python(來自:xkcd,http://xkcd.com/353/)
看Python在我工做中的應用,好像沒什麼說服力,證實不了啥。下面讓咱們看看有哪些大公司或有名的應用在使用Python,使用了哪些技術。
圖:誰用在用Python
上圖只是列舉了部分具備典型表明的公司,要列出全部的實在太困難的,由於太多國外在使用Python了。
在Google,C++、Java、Python是使用率排名前三的編程語言,使用Python的開發團隊也是Google的第三大研發部門。
在Google內部的不少項目,例如Google Engine使用C++編寫性能要求極高的部分,而後用Python或Java/Go調用相應的模塊。
groups.google.com,code.google.com就是運行於Python之上的。此外,Python還普遍的用於基礎維護部門。Guido Van Rossum加入Google的第一個項目Google Mondrian,是一個在線的代碼預覽系統,基於Perforce、BigTable(back-end)以及Python(front-end)。它使用瞭如下Python相關技術(http://goo.gl/3f5sy):
The application is built on top of Python open source libraries such as the Django framework, smtpd.py mail service, and the wsgiref web server software。
Google雄心勃勃的雲計算平臺Google App Engine最先支持的Python編程語言。
l Apache
l Python
l Linux(SuSe)
l MySQL
l psyco,一個動態的Python到C的編譯器
l lighttpd代替Apache作視頻查看
most of the lines of code for YouTube are still in Python. Everytime you watch a YouTube video you are executing a bunch of Python code.
YouTube解決問題的哲學只有一個詞:簡單。許多YouTube的產品最初只是源於一個簡單的Python腳本。
在線視頻王者YouTube的技術哲學,http://goo.gl/PHMUE,7 Years Of YouTube Scalability Lessons In 30 Minutes
下面內容主要摘自並加入了本身的註釋:Quora - Python 驅動,http://goo.gl/28RGq。
Quora 是使用什麼語言和框架作的?
What languages and frameworks were used to code Quora?
創始人 Charlie 的回覆:
爲何 Quora 選擇 Python 做爲開發語言
Why did Quora choose Python for its development?. 下文只是簡單整理,不是翻譯。
創始人 Adam 的回覆裏,提到兩個創始人正好都比較熟悉 Python. 另外他說明了排除其它語言的過程:
Python 雖然有性能問題,可是 Quora 一些性能很關鍵的代碼都用 C++ 寫(Python 的優點,Java 作起來相對困難)。至於類型檢查的缺少,Quora 經過完善的單元測試來彌補。
Quora 另外一位創始人 Charlie 加了幾點:
爲何 Quora 要用 Pylons 作開發
Why did Quora choose to develop in Pylons?. Charlie 說他們想把 Pylons 的不少東西替換成本身的,好比他們不須要模版和 ORM. 在這方面,Pylons 比 Django 之類的要好。
其餘八項能夠查看:http://goo.gl/nzFCy
Facebook九項工程改變科技產業之一——開源網絡服務框架 Tornado,是用 Pyhton 語言開發的實時網絡服務器,它支持上萬的不間斷鏈接,也支持以長輪詢(long-polling)方式發佈實時數據。
Tornado 最初是由 FriendFeed 公司開發出來的,而 FriendFeed 在 2009 被 Facebook 收購。隨後 Facebook 發佈Tornado 開源工程,如今包括 Quora 在內的多家網站已使用 Tornado。
Reddit(美國最大的網上社區)最先是用 Common Lisp 開發,隨之用 Python 進行了重寫(2005年末完成)。著名的Python 框架 Web.py 就是 Reddit 當時的員工 Aaron Swartz 開發的,如今 Reddit 的 Web 框架則使用了 Pylons 。在 2009 年 11 月,Reddit 遷移到 Amazon 的雲計算平臺。前端框架如今用的是 jQuery。或許你早就知道,Reddit網站程序如今已經開源https://github.com/reddit/reddit,若是你感興趣的話,不妨下載研究。
Dropbox 的99.9%的代碼是用Python寫的。Python使用在服務器端、桌面客戶端、網站控制邏輯,後端的 API 和分析。
使用 Python 語言編寫的代碼,經過使用PyObjs,WxPython,types,py2exe, py2ap,PyWin32等工具,讓Dropbox運行在Windows,Mac和Linux系統。
6 Lessons From Dropbox - One Million Files Saved Every 15 Minutes,http://goo.gl/Qj5sJ。
10億美圓被Facebook收購的Instagram,主要使用Python等開源技術。
應用服務器:
l 使用Django框架。
l 使用Gunicorn做爲 WSGI 服務器(過去曾用過 Apache 下的 mod_wsgi 模塊,不過發現 Gunicorn 更容易配置而且節省 CPU 資源)。
l 使用 Fabric 加速部署。
任務隊列/發佈通知
隊列服務使用Gearman,工做實例(都用Python寫的)在給定的時間內對隊列中的任務進行消費,並分發給不一樣的服務;對於消息推送,找到的最划算的方案是,一個開源的Twisted 服務 pyapns(A universal Apple Push Notification Service (APNS) provider)來實現,已經爲Instagram處理了超過10億條通知,而且絕對可靠。
參考:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,http://goo.gl/mkfQN;中文版:http://goo.gl/Dkymt。
OpenStack是一個美國國家航空航天局和Rackspace合做研發的雲端運算軟件,以Apache許可證受權,而且是一個自由軟件和開放源代碼項目。
OpenStack是IaaS(基礎設施即服務)組件,讓任何人均可以自行創建和提供雲端運算服務。此外,OpenStack也用做創建防火牆內的「私有云」(Private Cloud),提供機構或企業內各部門共享資源。
騰訊遊戲運營支撐體系的開發團隊,在使用django/celery/rabitmq/mongodb開發了一個已普遍使用的內部開放平臺。
Django:是一個開放源代碼的Web應用框架,由Python寫成。採用了MVC的軟件設計模式,即模型M,視圖V和控制器C。Django的主要目標是使得開發複雜的、數據庫驅動的網站變得簡單。Django注重組件的重用性和「可插拔性」,敏捷開發和DRY法則(Don't Repeat Yourself)。
Celery:(芹菜)是一個異步任務隊列/基於分佈式消息傳遞的做業隊列。它側重於實時操做,但對調度支持也很好。celery用於生產系統天天處理數以百萬計的任務。celery是用Python編寫的,但該協議能夠在任何語言實現。它也能夠與其餘語言經過webhooks實現。celery是易於集成Django, Pylons and Flask,使用 django-celery,celery-pylons and Flask-Celery 附加包便可。
豆瓣最初使用Python開發,只是用了3個月。洪強寧,《Python於web2.0網站的應用》,http://goo.gl/ZaI9s;《Python在豆瓣的應用》,http://goo.gl/IgeGe
最先的豆瓣就徹底使用 Python 開發,後臺索引基於 twisted,GUI 使用 Quixote,還用到了 cElementTree,數據庫是 MySQL。因此豆瓣天生就有着 Python 的文化。在豆瓣,開發環境正逐步從 Subversion 向 mercurial 遷移,還使用了 Python 編寫的 trac 和 IRC,之因此選擇 IRC 是由於 IRC 有很大的靈活性,能夠編寫 Bot 自動化不少東西。除此以外:
l m.douban.com使用:Pylons
l 內部管理系統使用: Django
l DPark系統:使用Python編寫,支持迭代計算的MapReduce框架
l DAE(douban app engine):使用Python編寫,相似於GAE、SAE,定位爲內部的 PaaS 平臺。
新浪Sina App Engine Python,是新浪研發的PaaS(平臺即服務)平臺,已經開始支持Python了。陳正《Introduction to SAE Python》, http://goo.gl/0lkRm
2007年,搜狐郵件中心基於webpy(除了webpy,還用了優秀的WEB框架 – Tornado),發佈了"搜狐閃電郵"的第一個Python版本。以後,Python就在搜狐郵件中心蓬勃的發展起來。到今天,搜狐郵箱已經成爲國內最大的Python應用之一。而Python也成爲了搜狐郵箱使用最普遍的語言。從運維到開發,從業務系統到基礎服務,處處都存在它的影子。
(摘自知乎官方解答)知乎開發主要用的是friendfeed的框架tornado。Tornado異步非阻塞的I/O模型的確讓人耳目一新,Tornado的優點主要在於對大量Comet長輪詢鏈接的維護上。這也是FriendFeed開發Tornado的緣由-----由於FriendFeed須要實時更新Timeline,而Comet又是目前最好,最流行的方法。因爲知乎也有大量長輪詢鏈接須要維護,因此選擇Tornado也就在情理之中了。
可是咱們也要看到,Tornado不是萬金油,因爲Tornado的WEB服務器爲單線程,一個Request若是阻塞了I/O,那麼這個進程將一直掛起,既沒法接受新的Request,也沒法Finish正在阻塞的其它Request。雖然能夠Spawn多個Tornado進程,可是進程這種重量級的東西,Spawn太多會消耗大量的內存資源。這種感受很像PHP的FastCGI進程那種味道。因此若是是會阻塞I/O的Request通常都是利用Tornado內置的異步HTTP Client交給其它動態後端來作。
因此Tornado在生產中通常前面都要包一層nginx作反向代理,用nginx來作靜態文件等大數據量的I/O操做。Tornado的I/O時間實在是太金貴了,在這上面耗不起。
國內一些遊戲後臺使用Python開發,特別是一些網頁遊戲。能夠搜索下有哪些公司在招聘Python遊戲開發,會發現有不少公司在招聘。
下面是幾篇在PyCon會議上的文章:
l 王健,《中型角色扮演遊戲服務器的Python應用》,http://goo.gl/b2R6M
l 賴勇浩,《Python於 webgame 的應用》,http://goo.gl/1QMOT
l 林偉(skywind),《Python遊戲開發探索與發現》中告訴你們Python已經足夠簡化到讓策劃人員也能寫代碼,用Python來描述一個遊戲的場景。國內WebGame已經超過國外,在網易大量遊戲項目用Python相關內容開發。
經過上面的介紹,是否是火燒眉毛的想學習下Python了。下面推薦學習Python相關工具與文章。
l wiki:http://zh.wikipedia.org/zh/Python
l Chinaunix的Python論壇資料
l 《OReilly-Learning-Python-4th-Edition-Oct-2009》
l 《簡明 Python 教程》(中文),對應的英文版是《A Byte of Python》
l 深刻 Python 3,http://goo.gl/cyrUY
l UliPad 代碼編輯工具(自己由python編寫)
l Pydev:eclipse + pydev插件