簡體   English   中英

長時間運行的 go 例程完成時發出信號

[英]Signal when long running go routines are completed

在這段代碼中,我有一個循環,它會一直運行到經過一定的時間。 在此期間,我將隨機數量的數字發送到一個通道,以便由運行時間更長的 go 例程進行處理。 問題是 go 例程仍然需要完成某種任務(在這個例子中只是睡覺)。 如何確保發送到numbers頻道的所有項目都已完成運行並且所有發送到messages頻道的項目都已讀取?

當我運行代碼時,我看到 66 個數字應該已經運行並被讀取。 但輸出僅顯示 66 個中的 6 個已運行然后讀出。

0s
10ms
20ms
30ms
40ms
50ms
60ms
70ms
80ms
90ms
Ran 3
Ran 5
Ran 1
Ran 0
100ms
Ran 4
Ran 2
110ms
DONE 66

去游樂場

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func DoStuff(n int, messages chan string) {
    time.Sleep(time.Duration(100) * time.Millisecond)
    messages <- fmt.Sprintf("Ran %d", n)
}

func Read(messages chan string) {
    for m := range messages {
        fmt.Println(m)
    }
}

func Run(numbers chan int, messages chan string) {
    for n := range numbers {
            go DoStuff(n, messages)
        }   
}

func main() {
    var min = 1
    var max = 10

    var numbers = make(chan int)
    var messages = make(chan string)

    go Read(messages)
    go Run(numbers, messages)

    var n = 0
    for start := time.Now(); ; {
        elapsedTime := time.Since(start)
        fmt.Println(elapsedTime)
        if elapsedTime > time.Duration(100) * time.Millisecond {
            break
        }
        var random = rand.Intn(max - min) + min
        for i := 0; i < random; i++ {
            n++
            numbers <- i
        }
        time.Sleep(time.Duration(10) * time.Millisecond)
    }

    fmt.Println("DONE", n)
}

使用等待組。 由於numbers代表傳入的工作,當您向numbers發送內容時,您可以向等待組添加一個:

wg.Add(1)
numbers <- i

當您閱讀消息時,將這項工作標記為已完成:

func Read(messages chan string, wg *sync.WaitGroup) {
    for m := range messages {
        wg.Done()
        fmt.Println(m)
    }
}

並且,等待等待組在 main 中完成:

wg.Wait()
fmt.Println("DONE", n)

聲明你的等待組,你可以在那里傳遞給 goroutines:

wg:=sync.WaitGroup{}
go Read(messages,&wg)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM