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