日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語言為并發(fā)而生

在早期 CPU 都是以單核的形式順序執(zhí)行機(jī)器指令。Go語言的祖先C語言正是這種順序編程語言的代表。順序編程語言中的順序是指:所有的指令都是以串行的方式執(zhí)行,在相同的時(shí)刻有且僅有一個(gè) CPU 在順序執(zhí)行程序的指令。

城中網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司

隨著處理器技術(shù)的發(fā)展,單核時(shí)代以提升處理器頻率來提高運(yùn)行效率的方式遇到了瓶頸,單核 CPU 發(fā)展的停滯,給多核 CPU 的發(fā)展帶來了機(jī)遇。相應(yīng)地,編程語言也開始逐步向并行化的方向發(fā)展。

雖然一些編程語言的框架在不斷地提高多核資源使用效率,例如 Java 的 Netty 等,但仍然需要開發(fā)人員花費(fèi)大量的時(shí)間和精力搞懂這些框架的運(yùn)行原理后才能熟練掌握。

作為程序員,要開發(fā)出能充分利用硬件資源的應(yīng)用程序是一件很難的事情?,F(xiàn)代計(jì)算機(jī)都擁有多個(gè)核,但是大部分編程語言都沒有有效的工具讓程序可以輕易利用這些資源。編程時(shí)需要寫大量的線程同步代碼來利用多個(gè)核,很容易導(dǎo)致錯(cuò)誤。

Go語言正是在多核和網(wǎng)絡(luò)化的時(shí)代背景下誕生的原生支持并發(fā)的編程語言。Go語言從底層原生支持并發(fā),無須第三方庫,開發(fā)人員可以很輕松地在編寫程序時(shí)決定怎么使用 CPU 資源。

Go語言的并發(fā)是基于 goroutine 的,goroutine 類似于線程,但并非線程。可以將 goroutine 理解為一種虛擬線程。Go語言運(yùn)行時(shí)會(huì)參與調(diào)度 goroutine,并將 goroutine 合理地分配到每個(gè) CPU 中,最大限度地使用 CPU 性能。

多個(gè) goroutine 中,Go語言使用通道(channel)進(jìn)行通信,通道是一種內(nèi)置的 數(shù)據(jù)結(jié)構(gòu),可以讓用戶在不同的 goroutine 之間同步發(fā)送具有類型的消息。這讓編程模型更傾向于在 goroutine 之間發(fā)送消息,而不是讓多個(gè) goroutine 爭(zhēng)奪同一個(gè)數(shù)據(jù)的使用權(quán)。

程序可以將需要并發(fā)的環(huán)節(jié)設(shè)計(jì)為生產(chǎn)者模式和消費(fèi)者的模式,將數(shù)據(jù)放入通道。通道另外一端的代碼將這些數(shù)據(jù)進(jìn)行并發(fā)計(jì)算并返回結(jié)果,如下圖所示。

提示:Go語言通過通道可以實(shí)現(xiàn)多個(gè) goroutine 之間內(nèi)存共享。

【實(shí)例】生產(chǎn)者每秒生成一個(gè)字符串,并通過通道傳給消費(fèi)者,生產(chǎn)者使用兩個(gè) goroutine 并發(fā)運(yùn)行,消費(fèi)者在 main() 函數(shù)的 goroutine 中進(jìn)行處理。

package main

import (
        "fmt"
        "math/rand"
        "time"
)

// 數(shù)據(jù)生產(chǎn)者
func producer(header string, channel chan<- string) {
     // 無限循環(huán), 不停地生產(chǎn)數(shù)據(jù)
     for {
            // 將隨機(jī)數(shù)和字符串格式化為字符串發(fā)送給通道
            channel <- fmt.Sprintf("%s: %v", header, rand.Int31())
            // 等待1秒
            time.Sleep(time.Second)
        }
}

// 數(shù)據(jù)消費(fèi)者
func customer(channel <-chan string) {
     // 不停地獲取數(shù)據(jù)
     for {
            // 從通道中取出數(shù)據(jù), 此處會(huì)阻塞直到信道中返回?cái)?shù)據(jù)
            message := <-channel
            // 打印數(shù)據(jù)
            fmt.Println(message)
        }
}

func main() {
    // 創(chuàng)建一個(gè)字符串類型的通道
    channel := make(chan string)
    // 創(chuàng)建producer()函數(shù)的并發(fā)goroutine
    go producer("cat", channel)
    go producer("dog", channel)
    // 數(shù)據(jù)消費(fèi)函數(shù)
    customer(channel)
}

運(yùn)行結(jié)果:

dog: 2019727887
cat: 1298498081
dog: 939984059
cat: 1427131847
cat: 911902081
dog: 1474941318
dog: 140954425
cat: 336122540
cat: 208240456
dog: 646203300

對(duì)代碼的分析:

  • 第 03 行,導(dǎo)入格式化(fmt)、隨機(jī)數(shù)(math/rand)、時(shí)間(time)包參與編譯。
  • 第 10 行,生產(chǎn)數(shù)據(jù)的函數(shù),傳入一個(gè)標(biāo)記類型的字符串及一個(gè)只能寫入的通道。
  • 第 13 行,for{} 構(gòu)成一個(gè)無限循環(huán)。
  • 第 15 行,使用 rand.Int31() 生成一個(gè)隨機(jī)數(shù),使用 fmt.Sprintf() 函數(shù)將 header 和隨機(jī)數(shù)格式化為字符串。
  • 第 18 行,使用 time.Sleep() 函數(shù)暫停 1 秒再執(zhí)行這個(gè)函數(shù)。如果在 goroutine 中執(zhí)行時(shí),暫停不會(huì)影響其他 goroutine 的執(zhí)行。
  • 第 23 行,消費(fèi)數(shù)據(jù)的函數(shù),傳入一個(gè)只能寫入的通道。
  • 第 26 行,構(gòu)造一個(gè)不斷消費(fèi)消息的循環(huán)。
  • 第 28 行,從通道中取出數(shù)據(jù)。
  • 第 31 行,將取出的數(shù)據(jù)進(jìn)行打印。
  • 第 35 行,程序的入口函數(shù),總是在程序開始時(shí)執(zhí)行。
  • 第 37 行,實(shí)例化一個(gè)字符串類型的通道。
  • 第 39 行和第 40 行,并發(fā)執(zhí)行一個(gè)生產(chǎn)者函數(shù),兩行分別創(chuàng)建了這個(gè)函數(shù)搭配不同參數(shù)的兩個(gè) goroutine。
  • 第 42 行,執(zhí)行消費(fèi)者函數(shù)通過通道進(jìn)行數(shù)據(jù)消費(fèi)。

整段代碼中,沒有線程創(chuàng)建,沒有線程池也沒有加鎖,僅僅通過關(guān)鍵字 go 實(shí)現(xiàn) goroutine,和通道實(shí)現(xiàn)數(shù)據(jù)交換。


網(wǎng)站名稱:創(chuàng)新互聯(lián)GO教程:Go語言為并發(fā)而生
分享網(wǎng)址:http://www.dlmjj.cn/article/coiooeg.html