1 回答

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的問(wèn)題實(shí)際上有兩部分:如何在Go中排隊(duì)數(shù)據(jù),以及如何在不阻塞的情況下使用通道。
對(duì)于第一部分,聽起來(lái)您需要做的是代替使用通道將內(nèi)容添加到隊(duì)列中,而是將通道用作隊(duì)列。例如:
var (
ch = make(chan int) // You can add an int parameter to this make call to create a buffered channel
// Do not buffer these channels!
gFinished = make(chan bool)
processFinished = make(chan bool)
)
func f() {
go g()
for {
// send values over ch here...
}
<-gFinished
close(ch)
}
func g() {
// create more expensive objects...
gFinished <- true
}
func processObjects() {
for val := range ch {
// Process each val here
}
processFinished <- true
}
func main() {
go processObjects()
f()
<-processFinished
}
至于如何使其更具異步性,您可以(如cthom06所指出的那樣)將第二個(gè)整數(shù)傳遞給第二行中的make調(diào)用,這將使發(fā)送操作異步進(jìn)行,直到通道的緩沖區(qū)已滿。
編輯:但是(如cthom06也指出),因?yàn)槟袃蓚€(gè)寫入通道的goroutine,所以其中之一必須負(fù)責(zé)關(guān)閉通道。另外,我的上一個(gè)修訂版本將在processObjects完成之前退出。我選擇同步goroutine的方式是通過(guò)創(chuàng)建幾個(gè)通過(guò)偽值傳遞的通道,以確保清理正確完成。這些通道沒有特別緩沖,因此發(fā)送以鎖定步驟進(jìn)行。
- 1 回答
- 0 關(guān)注
- 244 瀏覽
添加回答
舉報(bào)