Goroutine是一種比線程更加輕盈、更省資源的協(xié)程。當(dāng)Go語(yǔ)言引入了goroutine概念后,執(zhí)行輸入和輸出過(guò)程的函數(shù),在調(diào)用前使用關(guān)鍵字go,讓該函數(shù)能以goroutine方式執(zhí)行,利用函數(shù)具有的多值輸出特點(diǎn),引入信道的通信機(jī)制,使得并發(fā)編程變得非常簡(jiǎn)單。
具體的例子這在前幾篇文章中已經(jīng)詳細(xì)論述,Go語(yǔ)言通過(guò)使用goroutine,而不是操作系統(tǒng)的并發(fā)機(jī)制,通過(guò)系統(tǒng)的線程來(lái)多路派遣這些函數(shù)的執(zhí)行,使得每個(gè)用go關(guān)鍵字執(zhí)行的函數(shù)可以運(yùn)行成為一個(gè)單位協(xié)程。當(dāng)一個(gè)協(xié)程阻塞的時(shí)候,調(diào)度器就會(huì)自動(dòng)把其他協(xié)程安排到另外的線程中去執(zhí)行,從而實(shí)現(xiàn)了程序無(wú)等待并行化運(yùn)行。而且調(diào)度的開銷非常小,一顆CPU調(diào)度的規(guī)模不下于每秒百萬(wàn)次,這使得我們能夠創(chuàng)建大量的goroutine,從而可以很輕松地編寫高并發(fā)程序,達(dá)到我們想要的目的。
同時(shí)Go語(yǔ)言用channel(通道)輕巧地實(shí)現(xiàn)了CSP模型(Communicating Sequential Process),一個(gè)并發(fā)系統(tǒng)由若干并行運(yùn)行的順序進(jìn)程組成,每個(gè)進(jìn)程不能對(duì)其他進(jìn)程的變量賦值。進(jìn)程之間通過(guò)通信實(shí)現(xiàn)協(xié)作,方便地進(jìn)行跨goroutine的通信。通信過(guò)程中利用sync包提供了完備的讀寫鎖功能,使運(yùn)行在同一個(gè)內(nèi)存地址空間中的一個(gè)進(jìn)程內(nèi)創(chuàng)建的所有g(shù)oroutine,訪問(wèn)內(nèi)存變量前先獲取相應(yīng)的讀寫鎖。即:通過(guò)通信來(lái)共享內(nèi)存。使Go語(yǔ)言讓并發(fā)編程變得更加輕盈和安全。
啟動(dòng)goroutine之前先通過(guò)設(shè)置環(huán)境變量GOMAXPROCS的值來(lái)設(shè)置使用CPU核心,使GO語(yǔ)言實(shí)現(xiàn)了高并發(fā),多核并行的優(yōu)雅運(yùn)行。