這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
我為什麼從python轉向go語言
(2013-05-03 15:12:34)
轉載▼
標籤: go語言 python it |
分類: software |
我為什麼從python轉向go語言
chenyehao@gmail.com
2013-5-3
標題總是要吸引眼球,其實我至今還是python的愛好者,每個人都需要用合適的工具解決特定問題。
我從2004年開始使用python,在那之前,我使用perl。python文法簡潔,支援物件導向,支援異常處理,豐富的第三方程式碼程式庫,極大地提高了開發效率。在那以後,我一直使用python,開發企業軟體,自動化工具,和小網站。
然後在2012年,我加入看圖班(kantuban.com)這個創業公司,繼續使用python開發互連網產品。我們使用tornado來開發web的前台,以及後台服務。直到我使用tornado開發的後台服務遇上了效能瓶頸。
這是一個緩衝加上演算法的服務,需要從資料庫載入800萬條記錄到記憶體中,然後響應用戶端請求,在記憶體中計算出結果返回用戶端。這個服務佔用2.1G記憶體,初始化載入資料時間(也就是啟動時間)30分鐘。服務的平均回應時間在10ms以下。
問題是,python不支援利用多核的cpu,當執行個別耗時任務時,其它的請求被阻塞(在這裡非阻塞的編程模式不起作用,因為本身是密集計算,無法把計算任務推到進程之外)。如果依賴啟動多個執行個體來提高負載,則每個執行個體需要佔用2.1G記憶體,還要考慮進程間的資料同步。結論是,我們需要支援多線程多核的程式設計語言。如果一開始使用java,也許沒有這樣被動。
最後,我決定採用go語言。文法簡潔類似python,從語言上支援多核(無需寫代碼建立線程,只需要全域指定並發數),靜態語言更節省記憶體。
我花了一個多月,把代碼從python移植到go,基本上可以做到一行python代碼對應一行go代碼,移植並不困難,go的代碼也比較簡潔。新的go服務可以同時對外提供thrift和RESTful的介面。所有的努力都是值得的,我在這裡對比一下效能。
|
Python 2.6 |
Go 1.0.3 |
載入時間(分鐘:秒) |
30:00 |
2:40 |
佔用記憶體 |
2.1G |
700M |
一個典型計算服務耗時 |