第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么在并行處理時(shí)可以在 Go 中重用通道?

為什么在并行處理時(shí)可以在 Go 中重用通道?

Go
素胚勾勒不出你 2021-12-20 15:37:10
這是官方教程中的代碼片段package mainimport "fmt"func sum(s []int, c chan int) {    sum := 0    for _, v := range s {        sum += v    }    c <- sum // send sum to c}func main() {    s := []int{7, 2, 8, -9, 4, 0}    c := make(chan int)    go sum(s[:len(s)/2], c)    go sum(s[len(s)/2:], c)    x, y := <-c, <-c // receive from c    fmt.Println(x, y, x+y)}既然我們是并行計(jì)算的,每個(gè)線程都把結(jié)果保存到同一個(gè)通道中,這不是把數(shù)據(jù)搞砸了嗎?
查看完整描述

2 回答

?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

通道操作是 goroutine 安全的。你可以在任何 goroutine 中讀/寫/關(guān)閉,而不會(huì)破壞任何進(jìn)出通道的東西?;旧?,通道是同步點(diǎn)。無(wú)緩沖通道(如您的情況)將在每次寫入和讀取時(shí)阻塞。當(dāng)您編寫代碼時(shí),您的代碼會(huì)阻塞并等待有人開(kāi)始在另一端閱讀。當(dāng)您閱讀您的代碼時(shí),您的代碼會(huì)阻塞并等待有人開(kāi)始在另一端編寫。

在您的情況下,goroutines 中的計(jì)算將同時(shí)完成(不需要并行),但會(huì)在通道寫入時(shí)阻塞。您的主要 goroutine 將在第一次讀取時(shí)阻塞,讀取值。在第二次讀取時(shí)阻塞,讀取值。

即使您使用緩沖通道 - c := make(chan int, 2). 您的 goroutine 將完成計(jì)算,將結(jié)果寫入通道而不阻塞并終止。什么都不會(huì)被破壞。與此同時(shí),主 goroutine 將阻塞通道讀取并等待有人寫入它。

我建議你閱讀Effective go , Go Concurrency Patterns并嘗試A Tour of Go


查看完整回答
反對(duì) 回復(fù) 2021-12-20
?
長(zhǎng)風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊

確實(shí),當(dāng)您從兩個(gè)不同的 goroutine 通過(guò)一個(gè)通道發(fā)送兩個(gè)值時(shí),不一定保證排序(除非您已經(jīng)做了其他事情來(lái)協(xié)調(diào)它們的發(fā)送)。

但是,在此示例中,排序根本無(wú)關(guān)緊要。通道上正在發(fā)送兩個(gè)值:前半部分的總和和第二部分的總和。

go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)

由于這兩個(gè)值唯一用于計(jì)算總和,因此順序根本無(wú)關(guān)緊要。事實(shí)上,如果您運(yùn)行該示例的次數(shù)足夠多,您應(yīng)該會(huì)看到它x并且y經(jīng)常被交換,但總和x+y始終相同。


查看完整回答
反對(duì) 回復(fù) 2021-12-20
  • 2 回答
  • 0 關(guān)注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)