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

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

Goroutines - 將關(guān)鍵數(shù)據(jù)發(fā)送到單個 goroutine 并等待結(jié)果

Goroutines - 將關(guān)鍵數(shù)據(jù)發(fā)送到單個 goroutine 并等待結(jié)果

Go
慕無忌1623718 2023-01-03 15:56:27
我的應(yīng)用程序中運(yùn)行著許多 goroutine,并且我有另一個 goroutine 必須在同一時間段內(nèi)只處理一個請求,然后將結(jié)果發(fā)送回調(diào)用方。這意味著其他 goroutine 應(yīng)該等到必要的(單操作)goroutine 忙。[goroutine 1] <-                  -                    -                      - [goroutine 2]<- - - -  -> [Process some data in a single goroutine and send the result back to caller                      -                    -                  - [goroutine 3] <-這是它應(yīng)該是什么樣子的圖表我對 Go 非常陌生,而且我對如何正確實施它知之甚少。有人可以為我提供一些工作示例,以便我可以在 go playground 上運(yùn)行它嗎?
查看完整描述

2 回答

?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗 獲得超7個贊

這里有一個代碼片段,其中包含一些 worker-goroutine 和一個 processor-goroutine。只有一個 worker-goroutine 可以向處理器發(fā)送一些東西,因為processorChannel它只允許一個條目。處理器完成后,他將響應(yīng)發(fā)回給從中獲得工作的工人。


package main


import (

    "fmt"

    "time"

)


type WorkPackage struct {

    value           int

    responseChannel chan int

}


func main() {

    processorChannel := make(chan *WorkPackage)


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

        go runWorker(processorChannel)

    }


    go runProcessor(processorChannel)


    // Do some clever waiting here like with wait groups

    time.Sleep(5 * time.Second)

}


func runWorker(processorChannel chan *WorkPackage) {

    responseChannel := make(chan int)


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

        processorChannel <- &WorkPackage{

            value:           i,

            responseChannel: responseChannel,

        }

        fmt.Printf("** Sent %d\n", i)


        response := <-responseChannel

        fmt.Printf("** Received the response %d\n", response)


        // Do some work

        time.Sleep(300 * time.Millisecond)

    }

}


func runProcessor(processorChannel chan *WorkPackage) {

    for workPackage := range processorChannel {

        fmt.Printf("## Received %d\n", workPackage.value)


        // Do some processing work

        time.Sleep(100 * time.Millisecond)

        

        workPackage.responseChannel <- workPackage.value * 100

    }

}


查看完整回答
反對 回復(fù) 2023-01-03
?
斯蒂芬大帝

TA貢獻(xiàn)1827條經(jīng)驗 獲得超8個贊

我將使用添加兩個數(shù)字的 goroutine 來描述該方法。


聲明 goroutine 的請求和響應(yīng)類型。在請求中包含一個響應(yīng)值通道:


type request struct {

    a, b  int          // add these two numbers

    ch chan response

}


type response struct {

    n int              // the result of adding the numbers

}

啟動接收請求的 goroutine,執(zhí)行操作并將響應(yīng)發(fā)送到請求中的通道:


func startAdder() chan request {

    ch := make(chan request)

    go func() {

        for req := range ch {

            req.ch <- response{req.a + req.b}

        }

    }()

    return ch

}

要添加數(shù)字,請使用響應(yīng)通道向 goroutine 發(fā)送請求。在響應(yīng)通道上接收。返回響應(yīng)值。


func add(ch chan request, a, b int) int {

    req := request{ch: make(chan response), a: a, b: b}

    ch <- req

    return (<-req.ch).n

}

像這樣使用它:


ch := startAdder()

fmt.Println(add(ch, 1, 2))

在 GoLang PlayGround 上運(yùn)行它。



查看完整回答
反對 回復(fù) 2023-01-03
  • 2 回答
  • 0 關(guān)注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號