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

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

是否應該在長時間運行的進程中留下空閑線程?

是否應該在長時間運行的進程中留下空閑線程?

Go
喵喔喔 2021-12-06 19:12:43
我正在創建一個旨在長期運行并監聽工作的 go 程序。當它收到請求時,它會在進程隊列上運行工作。我是 golang 和系統編程的新手,所以我的問題是:我應該在程序啟動時啟動進程隊列(它有多個空閑的工作線程)(它們會一直坐在那里直到工作進入)還是我應該旋轉它們工作到達時啟動并在完成時關閉它們?我不清楚多個空閑線程將具有的整體系統影響,但我假設由于它們處于空閑狀態,因此在工作到達之前不會產生任何影響。話雖如此,我想確保我的程序是一個“好鄰居”并且盡可能高效。- 編輯 -澄清一下,“進程池”是一組在通道上等待工作的工作程序。它們應該在工作到來時啟動/停止,還是在程序啟動時啟動并等待工作到來?
查看完整描述

3 回答

?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

兩種方式的成本都非常低。goroutines 不需要單獨的操作系統線程,并且在阻塞通道接收時幾乎不消耗資源,但啟動的成本也很低,因此也沒有充分的理由讓它們保持打開狀態。


我的代碼很少使用工作池。通常,我的生產者會為其生成的每個工作單元生成一個 goroutine,并將其與響應通道一起直接傳遞出去,然后生成一個“偵聽器”,它對工作輸出進行一些格式化并將所有響應通過管道返回到主線程。我的常見模式如下:


func Foo(input []interface{}) resp chan interface{} {

    var wg sync.WaitGroup

    resp := make(chan interface{})

    listen := make(chan interface{})

    theWork := makeWork(input)

    // do work

    for _, unitOfWork := range theWork {

        wg.Add(1)

        go func() {

            // doWork has signature:

            //   func doWork(w interface{}, ch chan interface{})

            doWork(unitOfWork, listen)

            wg.Done()

        }()

    }

    // format the output of listen chan and send to resp chan

    // then close resp chan so main can continue

    go func() {

        for r := range listen {

            resp <- doFormatting(r)

        }

        close(resp)

    }()

    // close listen chan after work is done

    go func() {

        wg.Wait()

        close(listen)

    }()

    return resp

}

然后我的主函數將一些輸入傳遞給它并監聽響應通道


func main() {

    loremipsum := []string{"foo", "bar", "spam", "eggs"}

    response := Foo(loremipsum)

    for output := range response {

        fmt.Println(output)

    }

}


查看完整回答
反對 回復 2021-12-06
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

首先,您不能使用標準 Go 庫創建線程。在 Go Universe 中,您應該使用 goroutines,即所謂的綠色線程。

通常你不應該產生“可重用的”goroutine。它們的創建成本很低,因此在工作任務到達時按需創建它們,并在工作完成后立即完成(從 goroutine 返回)。

也不要猶豫,創建嵌套的 goroutines。通常,如果您覺得應該以并發方式做某事并且不要嘗試重用它們,那么像瘋了一樣生成它們,因為它沒有意義。


查看完整回答
反對 回復 2021-12-06
?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

任務隊列和等待工人的模式在 Go 中很常見。Goroutines 很便宜,但執行順序是不確定的。因此,如果您希望您的系統行為是可預測的,您最好通過循環或其他方式請求的無緩沖通道控制工作人員與主程序的會合。否則,其中一些可以生成但保持空閑狀態,這是合法的。


查看完整回答
反對 回復 2021-12-06
  • 3 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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