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

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

我們如何確定 Go 中“最后一個”工作進程/線程何時完成?

我們如何確定 Go 中“最后一個”工作進程/線程何時完成?

Go
一只甜甜圈 2022-01-10 15:15:15
我將使用一個 hacky 低效的素數查找器來使這個問題更加具體。假設我們的 main 函數觸發了一堆“worker”goroutine。他們會將結果報告給打印它們的單個通道。但并不是每個工人都會報告一些事情,所以我們不能使用計數器來知道最后一個工作何時完成。或者有什么辦法嗎?對于具體的例子,在這里,main 觸發 goroutine 以檢查值 2...1000 是否為素數(是的,我知道它效率低下)。package mainimport (    "fmt"    "time")func main() {    c := make(chan int)    go func () {        for {            fmt.Print(" ", <- c)        }    }()    for n := 2; n < 1000; n++ {        go printIfPrime(n, c)    }    time.Sleep(2 * time.Second)   // <---- THIS FEELS WRONG}func printIfPrime(n int, channel chan int) {    for d := 2; d * d <= n; d++ {        if n % d == 0 {            return        }    }    channel <- n}我的問題是我不知道如何在正確的時間可靠地停止它。我嘗試在末尾添加一個 sleepmain并且它可以工作(但它可能需要太長時間,而且這不是編寫并發代碼的方法?。?。我想知道是否有辦法通過通道或其他方式發送停止信號,以便main在正確的時間停止。這里的訣竅是我不知道會有多少工人響應。這是不可能的還是有一個很酷的技巧?(如果這個主要示例有答案,那就太好了。我可能可以概括?;蛘呖赡軟]有。也許這是特定于應用程序的?)
查看完整描述

1 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

使用WaitGroup.


以下代碼使用兩個 WaitGroup。main 函數用于wgTest等待print_if_prime函數完成。完成后,它會關閉通道以中斷打印 goroutine 中的 for 循環。主要功能用于wgPrint等待打印完成。


package main


import (

  "fmt"

  "sync"


func main() {

  c := make(chan int)

  var wgPrint, wgTest sync.WaitGroup


  wgPrint.Add(1)

  go func(wg *sync.WaitGroup) {

    defer wg.Done()

    for n := range c {

        fmt.Print(" ", n)

    }

  }(&wgPrint)


  for n := 2; n < 1000; n++ {

    wgTest.Add(1)

    go print_if_prime(&wgTest, n, c)

  }


  wgTest.Wait()

  close(c)

  wgPrint.Wait()

}


func print_if_prime(wg *sync.WaitGroup, n int, channel chan int) {

  defer wg.Done()

  for d := 2; d*d <= n; d++ {

    if n%d == 0 {

        return

    }

  }

  channel <- n

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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