天下武功為快不破,戲說Python與Go高并發爭鋒!
在這個以斗氣大陸橫行的世界,每一個大的勢力宗門都有自己的殺手锏的功法,比如老牌的古族有C++這樣的巨無霸語言,藥族有C語言,幾乎斗氣大陸所有的操作系統都是用C語言做的,畢竟斗氣都要靠吃丹藥維持。而實力非常猛的魂族有Java這樣的毀天滅地的語言,神秘莫測,勢力范圍也非常大,擁有廣大的用戶!
而斗氣大陸最近十年風頭最勁的當屬蕭族的Python語言。2007,2010,2018,三年都是排名第一。它可以做很多事情,身兼八大家族的各種功法于一身,比如爬蟲,數據分析,自動化測試,運維,數據挖掘和機器學習等等!而且在機器學習領域稱王稱霸,獨領風騷!
然后斗氣大陸無奇不有,各種新的功法層出不窮!天下武功為快不破,云計算里面的排名第一go最近風起云涌,尤其是搭上了區塊鏈這樣的龐大家族,財大氣粗未來前景非常看好!據說Go語言的功法里面最強的就是高并發劍招,那么我們今天來看看Python和Go的高并發之戰到底差距有多大!
1. Go語言的高并發
Go作為一門新興的編程語言,最大特點就在于它是原生支持并發的。和傳統基于 OS 線程和進程實現不同,Go語言的并發是基于用戶態的并發,這種并發方式就變得非常輕量,能夠輕松運行幾萬甚至是幾十萬的并發邏輯。
聽起來非常牛逼啊,到時Go的高并發有多快呢,我們不如寫一個最簡單的Hello world來看看。
1).首先,我們寫一個Hello world的函數,這個函數就干一件事,死命的打印Hello world from xx.
2).接著,我們開1000個線程(其實不是線程可以認為是協程,物理上對應一個線程)。大家可以看到開1000個這樣的線程是相當相當牛逼的,一般我們在Python里面開50個線程就非常了不起了,這里Go語言輕松開1000個并發!
因為Go生下來就是斗宗的強者,天生自帶并發特性。只需要用Go關鍵字就可以申明高并發了,非常簡潔!比起其他的語言需要用外掛丹藥修煉提升自己的斗氣,要簡潔不知道多少倍了!
3).最后,我們用time.sleep()讓主線程只停留1毫秒,1毫米的時間讓1000個人去死命打印hello world,我們看看結果哈:
看完上面的也許大家知道Go很能打,那短短的1毫秒Go到底能打印出多少個Hello world呢,比如我們設定一個5000吧,看看Go1毫秒能否打印出5000個Hello world!
我們還是打印HelloWorld, 這次直接打印5000個,然后限時在1毫秒內完成,看看Go能否5000個都打完?
Go 還是很強的,不僅異步的代碼書寫非常簡單,而且效率之高讓人瞠目結舌,畢竟人家是編輯器級別的并發,也就從娘胎里出來就是高并發的!
2. Python的高并發
Python里面的高并發非Asyncio莫屬,這個號稱是Python3里面最有野心的庫,從Python3.6開始逐漸穩定推出,到了Python3.7又進行了修正,到底跟Go會又多大的差距呢,我們來看一下:
Python的高并發協程需要靠后天的修行,也就是用庫Asyncio來完成,原生的并不支持高并發!那么我們也高并發5000個任務,每個任務都是打印HelloWorld,看看需要多久的時間?
這個結果也是讓我大跌眼鏡,也許可能是cpu密集性這樣的操作對Python來說本來就用Asyncio沒有啥優勢,但是無論如何這個效率確實跟Go比起來,遜色很多啊!
難怪現在很多大公司的后端開發,比如知乎的百萬級的高并發的訪問,慢慢從Python轉為Go語言,雖然重構的代價非常大,但是長遠看在性能這一條上,Go語言的優勢非常明顯!
當然上面的對比并不一定非常科學和嚴謹,畢竟Python的強項并不是高并發而是其幾乎變態的全能語言,也就是說你學會Python可以干很多很多事情,而且可以跨領域的做一些事情,而Go目前只是在云計算領域占有霸主地位!