亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang - 如何將多個渠道鏈接在一起?

Golang - 如何將多個渠道鏈接在一起?

Go
絕地無雙 2023-03-15 14:55:42
嘗試安排項目,將項目發送到“狀態”通道以獲取狀態,然后將項目發送到“刪除”通道以刪除項目。我正在設置兩個通道的大小,預計在項目刪除完成后我會“完成”。在“完成”之前執行“刪除”之后,代碼似乎正在停止。為什么我會收到“致命錯誤:所有 goroutines 都睡著了 - 死鎖!” 在“刪除項目”之后和“完成”之前?哪個例程正在睡覺?https://go.dev/play/p/W49niF5xngQpackage mainimport (    "fmt"    "time")func main() {    numbers := []int{1, 2, 4}    for _, n := range numbers {        fmt.Printf("Schedule and delete %d items.\n", n)        statusChan := make(chan string, n)        deleteChan := make(chan string, n)        done := make(chan bool)        go func(n int, statusChan chan<- string) {            for i := 0; i < n; i++ {                i := i                go func(n int, statusChan chan<- string) {                    fmt.Printf("Scheduling item number ... %d\n", i)                    itemNum := fmt.Sprintf("item_num_%d\n", i)                    time.Sleep(500 * time.Millisecond)                    statusChan <- itemNum                }(n, statusChan)            }        }(n, statusChan)        go func(statusChan <-chan string, deleteChan chan<- string) {            for itemNum := range statusChan {                fmt.Printf("Checking status of item number ... %s\n", itemNum)                time.Sleep(500 * time.Millisecond)                deleteChan <- itemNum            }        }(statusChan, deleteChan)        go func(deleteChan <-chan string, done chan<- bool) {            for itemNum := range deleteChan {                fmt.Printf("Delete item: %s", itemNum)                time.Sleep(500 * time.Millisecond)            }            fmt.Printf("Done with scheduling and deleting %d item.\n", n)            done <- true        }(deleteChan, done)        <-done    }}
查看完整描述

1 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

這似乎符合您的想法。我使用“***”作為“全部完成”的信號。


package main

import (

    "fmt"

    "time"

)


func main() {

    numbers := []int{1, 2, 4}

    for _, n := range numbers {

        fmt.Printf("Schedule and delete %d items.\n", n)

        statusChan := make(chan string, n)

        deleteChan := make(chan string, n)

        done := make(chan bool)


        go func(n int, statusChan chan<- string) {

            for i := 0; i < n; i++ {

                fmt.Printf("Scheduling item number ... %d\n", i)

                itemNum := fmt.Sprintf("item_num_%d\n", i)

                time.Sleep(500 * time.Millisecond)

                statusChan <- itemNum

            }

            statusChan <- "***"

        }(n, statusChan)


        go func(statusChan <-chan string, deleteChan chan<- string) {

            for itemNum := range statusChan {

              fmt.Printf("Checking status of item number ... %s\n", itemNum)

              deleteChan <- itemNum

            }

        }(statusChan, deleteChan)


        go func(deleteChan <-chan string, done chan<- bool) {

            for itemNum := range deleteChan {

              if itemNum == "***" {

                break

              }

              fmt.Printf("Delete item: %s", itemNum)

            }

            fmt.Printf("Done with scheduling and deleting %d item.\n", n)

            done <- true

        }(deleteChan, done)

        <-done

    }

}


查看完整回答
反對 回復 2023-03-15
  • 1 回答
  • 0 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號