成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 學(xué)習(xí):并發(fā)編程

開(kāi)發(fā) 前端
聊到并發(fā),就會(huì)有一系列的其他概念相繼而來(lái),比如:并行、進(jìn)程、線程、異步等。

Go 語(yǔ)言在創(chuàng)建之初,CPU 多核發(fā)展正猛,Go 語(yǔ)言的創(chuàng)始人果斷將面向多核、原生支持并發(fā)作為了 Go 語(yǔ)言的設(shè)計(jì)目標(biāo)之一,所以在 Go 語(yǔ)言中使用并發(fā)有得天獨(dú)厚的優(yōu)勢(shì)。

那么,什么是并發(fā)呢?

聊到并發(fā),就會(huì)有一系列的其他概念相繼而來(lái),比如:并行、進(jìn)程、線程、異步等。

我們經(jīng)常使用 C# 的 Winform 程序?qū)懸恍┕ぞ撸幾g后為一個(gè) exe 文件,文件執(zhí)行后就會(huì)作為一個(gè)進(jìn)程在 Windows 中執(zhí)行,在之前的單核 CPU 時(shí)代,在某個(gè)時(shí)刻只能執(zhí)行一個(gè)進(jìn)程對(duì)應(yīng)的程序代碼,兩個(gè)進(jìn)程不存在并行執(zhí)行的可能,多個(gè)處理器或多核處理器是并行執(zhí)行的必要條件。

如果對(duì)程序進(jìn)行改造,對(duì)執(zhí)行的任務(wù)進(jìn)行分解,每個(gè)分解出來(lái)的小的模塊由一個(gè)單獨(dú)的線程進(jìn)行處理,多個(gè)線程共享這個(gè)進(jìn)程所擁有的資源,線程作為執(zhí)行單元可被獨(dú)立調(diào)度到處理器上運(yùn)行。也許還是執(zhí)行在單 CPU 中,但是在并發(fā)執(zhí)行的。

Go 語(yǔ)言的創(chuàng)始人 Rob Pike 曾說(shuō)過(guò):并行關(guān)乎執(zhí)行,并發(fā)關(guān)乎結(jié)構(gòu)。

舉一個(gè)生活中的例子:

現(xiàn)在每天都在做的排隊(duì)做核酸,有三個(gè)步驟:

1、排隊(duì)。

2、掃二維碼。

3、捅喉嚨。

圖片


  • 需要做核酸的人分多個(gè)隊(duì)伍進(jìn)行排隊(duì),多個(gè)隊(duì)伍在并行進(jìn)行處理。
  • 每一個(gè)隊(duì)伍中只有一個(gè)檢測(cè)人員,先進(jìn)行掃碼,然后去捅喉嚨,兩個(gè)步驟完成后,再進(jìn)行下一個(gè)。

圖片


  • 掃碼和捅喉嚨都有單獨(dú)的人員進(jìn)行處理,這就像將程序拆分成多個(gè)線程進(jìn)行處理一樣。
  • 并發(fā)在單 CPU 也能發(fā)生,就像上圖中只有一個(gè)隊(duì)伍的情況,但多核或多 CPU 能發(fā)揮更大的作用。

由此可見(jiàn),要發(fā)揮并發(fā)的作用,離不開(kāi)線程和多核,線程創(chuàng)建的成本雖然已經(jīng)比進(jìn)程小了很多,但依然不適合大規(guī)模地創(chuàng)建線程,因?yàn)槌嗣總€(gè)線程占用的資源外,操作系統(tǒng)調(diào)度線程的成本也不小。

因此,Go 語(yǔ)言創(chuàng)造了 goroutine ,也叫協(xié)程,這是一個(gè)由 Go 運(yùn)行時(shí)負(fù)責(zé)調(diào)度的輕量級(jí)線程。和常規(guī)的線程相比,有這些好處:

  • 資源占用小, goroutine 的 Stack 的初始化的大小為 2k ,而像 C# 、Java 語(yǔ)言中線程的 Stack 都是兆級(jí)別的,所以 goroutine 的創(chuàng)建會(huì)更加快;
  • goroutine 是由 Go 運(yùn)行時(shí)調(diào)度,而不是操作系統(tǒng),切換速度會(huì)更快。

在 Go 中怎樣使用 goroutine 呢?非常的簡(jiǎn)單,使用關(guān)鍵字 go 就可以了,默認(rèn)情況下,主程序在單獨(dú)的一個(gè) goroutine 中,如果某個(gè)函數(shù)或匿名函數(shù)使用了 go 關(guān)鍵字,那么就會(huì)創(chuàng)建一個(gè)單獨(dú)的 goroutine 。

package main

import (
"fmt"
"time"
)

func testGouroutine(name string) {
fmt.Println("goroutine:", name)
}
func main() {
fmt.Println("這是主程序")
go testGouroutine("1")
go testGouroutine("2")
go testGouroutine("3")
go testGouroutine("4")
time.Sleep(time.Second)
}

如果在使用 go 關(guān)鍵字的函數(shù)中使用了主程序中的資源,就會(huì)出現(xiàn)競(jìng)爭(zhēng)的情況,看下面的這個(gè)例子:

package main

import (
"fmt"
"time"
)

func test() {
counter := 0
for i := 0; i < 5000; i++ {
go func() {
counter++
}()
}
time.Sleep(time.Second)
fmt.Println("counter:", counter)
}

func main() {
test()
}

每次運(yùn)行,counter 的值都會(huì)不一樣,因?yàn)槊看尾煌膮f(xié)程對(duì)公共資源 counter 的搶奪情況不一樣,要解決這個(gè)問(wèn)題就要用到鎖:

package main

import (
"fmt"
"sync"
"time"
)

func test() {
var mut sync.Mutex

counter := 0
for i := 0; i < 5000; i++ {
go func() {
defer mut.Unlock()
mut.Lock()
counter++
}()
}
time.Sleep(time.Second)

fmt.Println("counter:", counter)
}

func main() {
test()
}

值得注意的是,使用 go 關(guān)鍵字執(zhí)行的函數(shù)即便是有返回值,也會(huì)被忽略,如果需要在 goroutine 之間進(jìn)行通信,需要使用通道。

通道使用 make 進(jìn)行構(gòu)建,關(guān)鍵字為 chan 。看下面的例子:

package main

import (
"fmt"
"strconv"
"time"
)

func main() {
//使用 make 創(chuàng)建一個(gè)字符型的通道,通道使用關(guān)鍵字 chan
msg := make(chan string)
//在異步匿名函數(shù)中模擬同步數(shù)據(jù),完成一個(gè)給通道發(fā)送一個(gè)消息
go func() {
for i := 1; i <= 10; i++ {
if i == 10 {
msg <- "success"
} else {
msg <- "總共需要同步 10 個(gè)模塊,已經(jīng)處理 " + strconv.Itoa(i) + "個(gè)"
}
//每循環(huán)依次,演示 1 秒,模擬耗時(shí)
time.Sleep(time.Second)
}
}()

//主線程中進(jìn)行進(jìn)度顯示
for m := range msg {
if m == "success" {
fmt.Println("同步完成")
break
} else {
fmt.Println(m)
}
}
}

在匿名函數(shù)中每隔一秒就給主 gorourine 發(fā)送一個(gè)消息,主 gorourine 把這個(gè)消息打印出來(lái)。

最后總結(jié)下:

1、并行關(guān)乎執(zhí)行,并發(fā)關(guān)乎結(jié)構(gòu)。

2、Go 語(yǔ)言的并發(fā)是基于輕量級(jí)的 goroutine ,相比普通的線程,goroutine 有很多的好處。

3、在不同的 goroutine 之間進(jìn)行通信需要用到通道,通道使用 make 創(chuàng)建,關(guān)鍵字為 chan 。

責(zé)任編輯:姜華 來(lái)源: 不止dotNET
相關(guān)推薦

2022-04-24 15:29:17

微服務(wù)go

2017-11-10 11:27:48

Go并行算法

2023-02-10 09:40:36

Go語(yǔ)言并發(fā)

2023-11-27 18:07:05

Go并發(fā)編程

2024-07-08 00:01:00

GPM模型調(diào)度器

2025-06-17 09:32:15

2023-10-28 15:37:39

Go編程語(yǔ)言

2024-09-06 10:48:13

2020-01-14 11:17:33

Go并發(fā)Linux

2024-05-06 07:53:09

Go并發(fā)編程

2021-03-24 06:06:13

Go并發(fā)編程Singlefligh

2024-06-19 10:08:34

GoChannel工具

2024-03-05 18:24:52

I/O聚合優(yōu)化存儲(chǔ)

2024-04-11 07:40:55

Go并發(fā)編程

2021-09-30 09:21:28

Go語(yǔ)言并發(fā)編程

2025-03-24 00:25:00

Go語(yǔ)言并發(fā)編程

2024-10-14 08:51:52

協(xié)程Go語(yǔ)言

2024-06-17 08:40:16

2024-07-30 12:24:23

2021-02-24 19:03:00

開(kāi)源技術(shù) 編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91福利电影在线观看 | 久久精品久久久久久 | 国产成人99 | 久久ww| 欧美在线网站 | 久久国内 | 三级国产三级在线 | 激情欧美一区二区三区中文字幕 | 国产成人99久久亚洲综合精品 | 亚洲一区 | 亚洲综合大片69999 | 99综合网 | 亚洲综合久久精品 | 2020国产在线 | 人人爽人人爽人人片av | 九九久久精品 | 中文字幕免费观看 | 欧美成人精品二区三区99精品 | 欧美视频精品 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲精品欧美 | 天天综合网永久 | 91偷拍精品一区二区三区 | 欧美成人精品 | 色婷婷一区二区三区四区 | 国产ts人妖系列高潮 | 国产精品一区二区视频 | 婷婷久久网 | 成人一区二区三区视频 | 99久久精品免费看国产四区 | 亚洲网址 | 黄色免费在线观看 | 久久男人天堂 | 亚洲国产高清高潮精品美女 | 激情小视频 | 99久久久国产精品 | 欧美黑人狂野猛交老妇 | 亚洲欧美中文日韩在线v日本 | a a毛片| 五月天天丁香婷婷在线中 | 色婷婷一区二区三区四区 |