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

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

Effective Go 中的客戶端請求處理程序示例導致死鎖?

Effective Go 中的客戶端請求處理程序示例導致死鎖?

Go
慕無忌1623718 2022-06-27 10:44:36
Effective Go指南有以下處理客戶端請求的示例:func handle(queue chan *Request) {    for r := range queue {        process(r)    }}func Serve(clientRequests chan *Request, quit chan bool) {    // Start handlers    for i := 0; i < MaxOutstanding; i++ {        go handle(clientRequests)    }    <-quit  // Wait to be told to exit.}我在本地運行了類似的代碼,其中客戶端請求只是整數:func handle(queue chan int) {    for r := range queue {        fmt.Println("r = ", r)    }}func serve(clientRequests chan int, quit chan bool) {    // Start handlers    for i := 0; i < 10; i++ {        go handle(clientRequests)    }    <-quit // Wait to be told to exit.}var serveChannel = make(chan int)var quit = make(chan bool)serve(serveChannel, quit)for i := 0; i < 10; i++ {    serveChannel <- i}但是我的代碼導致死鎖錯誤fatal error: all goroutines are asleep - deadlock!。即使我從概念上不理解程序中的問題,我也不理解原始代碼是如何工作的。我確實理解MaxOutstanding生成了 goroutines 并且它們都聽clientRequests單通道。但是clientRequests通道只針對一個請求,所以一旦一個請求進來,那么所有的 goroutine 都可以訪問同一個請求。為什么這很有用?
查看完整描述

1 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

調用的代碼serve不應該與填滿通道的代碼在同一個 goroutine 中運行。


在您的代碼中,serve啟動處理程序 goroutines 但隨后等待<-quit. 由于它被阻止,您永遠無法訪問填充的代碼serveChannel。所以工人們從來沒有任何東西可以消費。你也永遠不會通知quit,讓serve等待永遠。


第一步是serveChannel在單獨的 goroutine 中發(fā)送數據。例如:


func handle(queue chan int) {

    for r := range queue {

        fmt.Println("r = ", r)

    }

}


func serve(clientRequests chan int, quit chan bool) {

    // Start handlers

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

        go handle(clientRequests)

    }

    <-quit // Wait to be told to exit.

}


func populateRequests(serveChannel chan int) {

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

        serveChannel <- i

    }

}


func main() {

    var serveChannel = make(chan int)

    var quit = make(chan bool)

    go populateRequests(serveChannel)

    serve(serveChannel, quit)

}

我們現(xiàn)在可以根據需要處理所有請求。


all goroutines are asleep但是,一旦處理完成,您仍然會遇到。這是因為serve最終等待quit信號但沒有任何東西可以發(fā)送。


在正常程序中,quit將在捕獲信號或某些shutdown請求后填充。由于我們沒有任何東西,我們將在三秒鐘后將其關閉,也在一個單獨的 goroutine 中。


func handle(queue chan int) {

    for r := range queue {

        fmt.Println("r = ", r)

    }

}


func serve(clientRequests chan int, quit chan bool) {

    // Start handlers

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

        go handle(clientRequests)

    }

    <-quit // Wait to be told to exit.

}


func populateRequests(serveChannel chan int) {

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

        serveChannel <- i

    }

}


func quitAfter(quit chan bool, duration time.Duration) {

    time.Sleep(duration)

    quit <- true

}


func main() {

    var serveChannel = make(chan int)

    var quit = make(chan bool)

    go populateRequests(serveChannel)

    go quitAfter(quit, 3*time.Second)

    serve(serveChannel, quit)

}

至于您的最后一個問題:多個處理程序不會看到相同的請求。當一個處理程序從通道接收到一個值時,該值就會從通道中刪除。下一個處理程序將接收下一個值。將通道視為可安全并發(fā)使用的先進先出隊列。


您可以在操場上找到代碼的最后一次迭代。


查看完整回答
反對 回復 2022-06-27
  • 1 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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