Go基礎系列 指定goroutine的執行順序

2022-02-20 09:29:07 字數 1207 閱讀 6880

go channel系列

當關閉乙個channel時,會使得這個channel變得可讀。通過這個特性,可以實現乙個goroutine執行順序的技巧。

如果乙個goroutine a依賴於另乙個goroutine b,在goroutine a中首先通過讀goroutine b來阻塞自己,直到goroutine b關閉自身之後,goroutine a才會繼續執行。這樣,goroutine b就先於goroutine a執行。

下面是乙個指定goroutine執行順序的示例,它保證的順序是a()-->b()-->c()

package main

import (

"fmt"

"time"

)// a首先被a阻塞,a()結束後關閉b,使b可讀

func a(a, b chan struct{})

// b首先被a阻塞,b()結束後關閉b,使b可讀

func b(a, b chan struct{})

// c首先被a阻塞

func c(a chan struct{})

func main() )

y := make(chan struct{})

z := make(chan struct{})

go c(z)

go a(x, y)

go c(z)

go b(y, z)

go c(z)

// 關閉x,讓x可讀

close(x)

time.sleep(3 * time.second)

}

上面的示例中:a goroutine被x阻塞,b goroutine被y阻塞,c goroutine被z阻塞。c依賴的z由b關閉,b依賴的y由a關閉。

如此一來,當main goroutine中的x被關閉後,a()從阻塞中釋放,繼續執行,關閉y,然後b從阻塞中釋放,繼續執行,關閉z,c得以釋放。由於z被關閉後,z仍然可讀,所以多次執行c(z)不會出問題。

a()和b()不能多次執行,因為close()不能操作已被關閉的channel。

注意,上面的channel都是struct{}型別的,整個過程中,x、y、z這3個通道都沒有傳遞資料,而是直接關閉來釋放通道,讓某些阻塞的goroutine繼續執行下去。顯然,這裡的x、y、z的作用都是"訊號通道",用來傳遞訊息。

Go基礎系列 指定goroutine的執行順序

go channel系列 當關閉乙個channel時,會使得這個channel變得可讀。通過這個特性,可以實現乙個goroutine執行順序的技巧。如果乙個goroutine a依賴於另乙個goroutine b,在goroutine a中首先通過讀goroutine b來阻塞自己,直到gorout...

GO 開發系列 基礎 Go 併發程式設計

併發和並行說明 併發特點 並行特點 go 協程 說明 乙個 go 執行緒上可以起多個協程,協程可以理解為是輕量級的執行緒 go 協程特點 go 併發原理 mpg 模型 詳見部落格 示例 package main import fmt time 向 intchan放入 1 8000 個數 func p...

Go基礎系列 nil channel用法示例

go channel系列 當未為channel分配記憶體時,channel就是nil channel,例如var ch1 chan int。nil channel會永遠阻塞對該channel的讀 寫操作。nil channel會阻塞對該channel的所有讀 寫。所以,可以將某個channel設定為...