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

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

為什么我的“完成”頻道會(huì)隨機(jī)關(guān)閉?

為什么我的“完成”頻道會(huì)隨機(jī)關(guān)閉?

Go
ITMISS 2023-08-14 14:40:11
我構(gòu)建了以下 go 代碼。這個(gè)想法是構(gòu)建一個(gè)完成通道和一個(gè)生成 int 通道的生成器。將它們鏈接到一個(gè) 2 階段管道 chanNumbers := pipelineb(done, pipelinea(done, gen(done)))幾秒鐘后,取消已完成的通道。我希望看到生成器和管道的兩級(jí)取消并返回,但文本“PipeX 現(xiàn)在終止”僅隨機(jī)出現(xiàn),我真的不明白為什么。有人有主意嗎?package mainimport (    "fmt"    "time")func gen(done <-chan interface{}) <-chan int {    ret := make(chan int)    cx := 0    go func() {        for {            select {            case <-done:                fmt.Println("**Generator Terminates now")                time.Sleep(2 * time.Second)                fmt.Println("**Generator has terminated now")                close(ret)                return            case ret <- cx:                fmt.Printf("Gen : we push %d \n", cx)                cx = cx + 1            }        }    }()    fmt.Println("Generator has created and returned its channel")    return ret}func pipea(done <-chan interface{}, in <-chan int) <-chan int {    ret := make(chan int)    go func() {        for {            select {            case <-done:                fmt.Println("**pipeA terminates")                time.Sleep(2 * time.Second)                fmt.Println("**pipeA has terminated now")                close(ret)                return            case tmp, ok := (<-in):                if ok {                    fmt.Printf("pipeA : we push %d \n", tmp)                    ret <- tmp                } else {                    in = nil                }            }        }    }()    return ret}func pipeb(done <-chan interface{}, in <-chan int) <-chan int {    ret := make(chan int)    go func() {        for {            select {            case <-done:                fmt.Println("**pipeB terminates")                time.Sleep(2 * time.Second)                fmt.Println("**pipeB has terminated now")                close(ret)
查看完整描述

1 回答

?
收到一只叮咚

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

您有四個(gè)正在運(yùn)行的 go 例程:

  1. gen,你的生成器,寫(xiě)入無(wú)緩沖的輸出通道,直到done

  2. pipeA,從 讀取gen,寫(xiě)入無(wú)緩沖的輸出通道,直到done

  3. pipeB,從 讀取pipeA,寫(xiě)入無(wú)緩沖的輸出通道,直到done

  4. main,從pipeB讀到done

現(xiàn)在,當(dāng)您關(guān)閉時(shí)done,它完全取決于 go 例程看到它的順序。

如果main是第一個(gè)看到它done已關(guān)閉,它將打破 for 循環(huán)并停止消耗pipeB。但是如果pipeB仍然嘗試寫(xiě)入輸出通道(ret <- tmp),它將在那里阻塞;所以它永遠(yuǎn)不會(huì)到達(dá)該<- done部分。

有兩個(gè)選項(xiàng)可以解決此問(wèn)題:

  1. 只在你的生成器中監(jiān)聽(tīng)done,并讓其他 go 例程使用for n := range in { }.

  2. select將您的發(fā)送邏輯也放入 a 中,以便您的生成器和管道可以檢測(cè)何時(shí)done關(guān)閉。

或者,您可能希望使用緩沖輸出通道,但即使如此,此問(wèn)題仍然可能發(fā)生。


查看完整回答
反對(duì) 回復(fù) 2023-08-14
  • 1 回答
  • 0 關(guān)注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報(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)