日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一篇文章帶你入門Go語言基礎(chǔ)之并發(fā)

前言

在百色等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需求定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,百色網(wǎng)站建設(shè)費(fèi)用合理。

Hey,大家好,我是碼農(nóng)星期八,終于到了Go中最牛掰的地方,并發(fā),這也是Go為什么能快速火的原因。

部署方便,不需要容器,隨便跑一個(gè)都是相當(dāng)于Nginx的存在,怎么肯能不火

所以,來看看吧!!!

引言

Go語言,專門為并發(fā)而生的語言,每啟動一個(gè)微線程創(chuàng)建一個(gè)代價(jià)大概2KB起步

假設(shè)一個(gè)內(nèi)存條大小4G,一個(gè)微線程2kb,1G=1024M=1048576kb,1048576/2=524288,五十多萬個(gè)

但是你知道像Java,Python等語言,一個(gè)線程代價(jià)多大嗎???,2MB起步,代價(jià)直接翻了千倍

所以,激動吧,隨便用Go寫一個(gè)web程序,基本都相當(dāng)于Nginx

goroutine

Go中的微線程,也叫做goroutine,goroutine是并行處理任務(wù)的

就像我用兩只手同時(shí)操作兩個(gè)手機(jī)打游戲一樣

而不是一個(gè)手玩玩這個(gè),一個(gè)手玩玩那個(gè),這樣切換式玩法

goroutine由Go的runtime完成調(diào)度,goroutine的本質(zhì)是在代碼(用戶態(tài))級別完成的切換,代價(jià)很小

像Java,Python等語言的線程,是在操作系統(tǒng)(內(nèi)核態(tài))級別完成的切花,所以代價(jià)非常大

由于goroutine是由runtime完成切換,并且runtime經(jīng)過Google公司的數(shù)位大佬優(yōu)化,已經(jīng)很小母牛上山了,牛逼哄哄了。

使用goroutine

在Go中使用goroutine很簡單,只需要在想調(diào)用的函數(shù)前加一個(gè)go就行了,這就代表啟動了一個(gè)goroutine

普通調(diào)用函數(shù)方式

函數(shù)

 
 
 
 
  1. func Say() { 
  2.     time.Sleep(time.Second) 
  3.     fmt.Println("我在說話說了1s說完了...") 

 main

 
 
 
 
  1. func main() { 
  2.     //開始時(shí)間 
  3.     var start_time = time.Now() 
  4.     //啟動10個(gè)say說話 
  5.     for i := 0; i < 10; i++ { 
  6.         Say() 
  7.     //結(jié)束時(shí)間 
  8.     var end_time = time.Now() 
  9.     //計(jì)算時(shí)間差 
  10.     fmt.Println(end_time.Sub(start_time)) 

執(zhí)行結(jié)果

循環(huán)了10次,耗時(shí)10s,有點(diǎn)慢啊!

goroutine調(diào)用函數(shù)方式

函數(shù)還是上述的函數(shù)

main

 
 
 
 
  1. func main() { 
  2.     //開始時(shí)間 
  3.     var start_time = time.Now() 
  4.     //啟動10個(gè)say說話 
  5.     for i := 0; i < 10; i++ { 
  6.         go Say() 
  7.     //結(jié)束時(shí)間 
  8.     var end_time = time.Now() 
  9.     //計(jì)算時(shí)間差 
  10.     fmt.Println(end_time.Sub(start_time)) 

注意:第6行,前面加了個(gè)go關(guān)鍵字,go關(guān)鍵字就表示以一個(gè)微線程的方式單獨(dú)運(yùn)行這個(gè)函數(shù)。

執(zhí)行結(jié)果

what??? 0s,什么情況?

為什么會出現(xiàn)0s這種情況

這是因?yàn)椋贕o中,我們采用的是守護(hù)線程的方式,什么意思呢?

在Go中,main函數(shù)只要執(zhí)行完,其他微線程必涼。

就像有的怪獸,他們是互相依賴一個(gè)母體的,母體掛了,下面的娃也必掛。

所以該怎么解決這個(gè)問題呢???

sync.WaitGroup

上述我們發(fā)現(xiàn),啟動了一些微線程,但是微線程還沒來得及執(zhí)行就掛了,是因?yàn)閙ain函數(shù)跑的太快了,main跑完了,Go運(yùn)行時(shí)自動將其他微線程關(guān)閉了。

那反過來想,我們?nèi)绾巫宮ain在最后等一下,等我的孩子們都回來了,我在繼續(xù)跑。

所以,有一個(gè)新的問題,那就是等,祭出法寶sync.WaitGroup

先看一下怎么用

函數(shù)

 
 
 
 
  1. func Say() { 
  2.     //函數(shù)結(jié)束時(shí)取消標(biāo)記 
  3.     defer wg.Done() 
  4.     //每個(gè)函數(shù)在啟動時(shí)加上一個(gè)標(biāo)記 
  5.     wg.Add(1) 
  6.     //函數(shù)開始打上一個(gè)標(biāo)記 
  7.     time.Sleep(time.Second*1) 
  8.     fmt.Println("我在說話說了1s說完了...") 

main

 
 
 
 
  1. var wg  sync.WaitGroup 
  2. func main() { 
  3.     //開始時(shí)間 
  4.     var start_time = time.Now() 
  5.     //啟動10個(gè)say說話 
  6.     for i := 0; i < 10; i++ { 
  7.         go Say() 
  8.     // 等待所有標(biāo)記過的微線程執(zhí)行完畢 
  9.     wg.Wait() 
  10.     //結(jié)束時(shí)間 
  11.     var end_time = time.Now() 
  12.     //計(jì)算時(shí)間差 
  13.     fmt.Println(end_time.Sub(start_time)) 

執(zhí)行結(jié)果

可以看到,10個(gè)線程同時(shí)啟動,1s就完了,并且代碼相對簡單,就算開啟10w個(gè),還是1s多一點(diǎn)

這也是為什么很多公司越來越青睞Go的原因。

runtime.GOMAXPROCS

這個(gè)意思要使用多少個(gè)核,默認(rèn)使用全部核心,性能跑滿,但是也有意外的情況,

比如一個(gè)機(jī)器跑了很多其他任務(wù),Go寫的這個(gè)是不太重要的任務(wù),但是是計(jì)算型的,這時(shí)候理論來說是不盡量擠兌別人的算力

所以要限制一下當(dāng)前程序使用電腦的算力

代碼

 
 
 
 
  1. func main() { 
  2.     //本機(jī)的cpu個(gè)數(shù) 
  3.     var cpuNum = runtime.NumCPU() 
  4.     fmt.Println(cpuNum) 
  5.     //設(shè)置Go使用cpu個(gè)數(shù) 
  6.     runtime.GOMAXPROCS(4) 

總結(jié)

上述我們學(xué)習(xí)了Go的并發(fā),學(xué)習(xí)了

  • 如何創(chuàng)建一個(gè)協(xié)程(goroutine)。
  • 為什么需要sync.WaitGroup。
  • 設(shè)置當(dāng)前程序使用CPU核數(shù)。

在Go中,輕松實(shí)現(xiàn)一個(gè)高并發(fā)還是挺容易的,但是可能有些不是那么好理解。


網(wǎng)站欄目:一篇文章帶你入門Go語言基礎(chǔ)之并發(fā)
當(dāng)前路徑:http://www.5511xx.com/article/djddije.html