NIO(非阻塞IO)是一種IO編程模型,Golang中的IO底層實現(xiàn)方式和java NIO模型一致,通俗點說就是都采用了EPOLL。 你在使用golang讀文件的時候,goroutine 會默默的掛起,只是你不知道,當讀完畢了,goroutine 再次恢復,但你不用擔心,goroutine 的掛起和恢復沒有java線程那樣可怕,你可以認為goroutine 的掛起和恢復就是保存和恢復幾個變量的值,其實也是這樣的。
目前成都創(chuàng)新互聯(lián)公司已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機、網(wǎng)站托管、服務器托管、企業(yè)網(wǎng)站設(shè)計、貴定網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
剩下的就是goroutine 和 java線程的區(qū)別了,goroutine是用戶態(tài)的線程切換,java采用的是系統(tǒng)線程切換,用匯編語言描述是一個(java)調(diào)用int 80軟中斷,一個沒有。 意味著goroutine更輕量級,可以同時相應成千上萬的線程切換,java你創(chuàng)造上千個線程就有些吃力了。
因為java線程不能創(chuàng)造過多的線程,如果同時處理上萬上千的請求時候,就要考慮在幾十個線程來處理上萬上千的請求,這就出現(xiàn)了很多請求和線程不可能一一對應,所以通常做法是每個線程分別處理單個請求各個階段。好比流水線,請求是要加工的商品,每個線程處理一道工序,這樣做的好處是每人都做自己熟悉的,對于程序來說每個線程執(zhí)行的代碼永遠都是自己很短的一塊,這樣根據(jù)局部優(yōu)化原理,更具備CPU,內(nèi)存親和力,利于JIT。說這樣多,就是說如果線程和請求不能一一對應,流水線式的并發(fā)編程很麻煩,閱讀性也很差,通常是線程A里面一段邏輯代碼,線程B又有另一處處理的邏輯代碼。
由于goroutine 的輕便,你可以將請求和goroutine 一一對應起來,不用考慮將請求在線程之間換來換去,只關(guān)心你的業(yè)務邏輯,這就是goroutine 的好處。
總結(jié):
golang的goroutine讓你比java更容易編寫并發(fā)程序,但性能不會有差別(目前來說,golang性能還不能和java比,看過代碼就知道了,GC弱到爆),代碼不會減少,該寫的邏輯還得寫。ps,其實golang的(sched)go程切換代碼雖然原理和java的fork-join框架一樣,但是fork-join比golang的sched代碼牛逼不少,開始膜拜Doug Lea吧,golang還有很長的路要走。
?? 當讀取91.2 MB文件時,read1耗時43ms,read2耗時99ms。
查看源碼:
讀取文件主要是通過 Read(p []byte) (n int, err error) :
官方文檔中關(guān)于該接口方法的說明:
結(jié)論:
??ReadFile(filename string)方法之所以速度快的原因就是先計算出file文件的size,在初始化對應size大小的buff,傳入ReadRead(p []byte) 來讀取字節(jié)流
實現(xiàn)指定個核心最大化使用,比如核心總數(shù)減一。
必要的庫。
要使用的cpu數(shù)量,建議不全使用。
建立管道。
聲明使用的cpu數(shù)。
建立互斥關(guān)系,本例中主要為了實現(xiàn)所有線程執(zhí)行完后再執(zhí)行后續(xù)程序。
創(chuàng)建cpu數(shù)減1個線程
后面每個任務結(jié)束時要done一個wg,這里根據(jù)具體情況加,是循環(huán)就在每個循環(huán)里加,保證后面能全部done即可
沒有緩沖的、阻塞式的往管道傳遞字符串。
Wait是等所有線程都執(zhí)行完,即增加的數(shù)字被全done掉。
關(guān)閉管道。
假設(shè)已有的函數(shù)是ReadLogs,在它的基礎(chǔ)上加個Wg加函數(shù)名的新函數(shù),我覺得這種方式不改變原有的,比較舒服。
大意是:循環(huán)從管道讀取字符串,讀不到了就跳出循環(huán)。
每個ReadLogs()之后加一個wg.Done(),相當于計數(shù)減一。
ReadLogs()就是要執(zhí)行的任務,不再解釋。
就是開指定個線程。
管道阻塞傳值。
wg同步。
WgReadLogs循環(huán)接收。
go多線程傳輸文件,序列不變是真的。線程太占資源,線程調(diào)度開銷大。go中的goroutine是一個輕量級的線程,執(zhí)行時只需要4-5k的內(nèi)存,比線程更易用,更高效,更輕便,調(diào)度開銷比線程小。