golang channel阻塞問題解決

2021-08-09 15:34:38 字數 638 閱讀 7475

先看一段會死鎖的**:

package main

import (

"fmt"

)func f1(in chan

int)

func main()

單純的out<-和<-in都會阻塞,只有兩個同時進行了,才能繼續執行。 這裡你看上去有個協程,來執行<-in,但是實際上已經阻塞在out<-2了,協程沒辦法執行下去…… 解決辦法就兩個,要麼在out <- 2之前開乙個goroutine去消費這個channel, 要麼就給這個channel加個緩衝防止阻塞。

解決方法1.先消費channel

package main

import (

"fmt"

)func f1(in chan

int)

func main()

解決方法2.給channel加buffer

package main

import (

"fmt"

)func f1(in chan

int)

func main()

golang channel基本操作

channel可以實現執行緒的阻塞。建立無緩衝區channel,只能存放乙個值。var ch make chan int 建立有緩衝區channel,可以存放多個值,值到達上限才會阻塞。var ch1 make chan int,3 賦值 ch 555 取值 ch 關閉chnneal,關閉後無法在使...

深入學習golang channel

網路,併發 是go語言的兩大feature。go語言號稱 網際網路的c語言 與使用傳統的c語言相比,寫乙個server所使用的 更少,也更簡單。寫乙個server除了網路,另外就是併發,相對python等其它語言,go對併發支援使得它有更好的效能。goroutine和channel是go在 併發 方...

Golang channel 使用總結(一)

package main import fmt func main hbhly 56 128 demo go run g.go fatal error all goroutines are asleep deadlock goroutine 1 chan send main.main search ...