首頁 > 後端開發 > Golang > 主體

如何在 Golang 中實現真正的並行:Goroutines、死鎖和通道?

Susan Sarandon
發布: 2024-11-04 20:03:02
原創
258 人瀏覽過

How to Achieve True Parallelism in Golang: Goroutines, Deadlocks, and Channels?

Golang 中的平行處理:利用並發來提高效能

考慮提供的程式碼,其中展示了 Goroutine 的並行處理。然而,它提出了關於並發執行的潛力以及實現並行性的最佳方法的問題。

dowork 的並發執行

dowork 並行執行的前提是不保證。雖然 goroutine 提供了輕量級的並發機制,但作業系統排程器決定了實際的執行順序。根據 Go 1.5 的發行說明,GOMAXPROCS 通常與可用內核保持一致。

建議方法:死鎖預防和同時控制

關於維護 main 函數的執行、 fmt.Scanln 可能不可靠,尤其是在生產環境中。相反,考慮實現一個sync.WaitGroup來確保所有goroutine在退出之前完成。此外,為了增強並發控制並確保並行任務的適當資源利用,建議為每個 goroutine 使用獨立的 dowork Worker 通道。

用於平行函數執行的實用函數

為了簡化並行函數執行,可以利用現有的實用函數,如下所示:

<code class="go">import "sync"

// Parallelize parallelizes function calls
func Parallelize(functions ...func()) {
    var waitGroup sync.WaitGroup
    waitGroup.Add(len(functions))

    defer waitGroup.Wait()

    for _, function := range functions {
        go func(f func()) {
            defer waitGroup.Done()
            f()
        }(function)
    }
}</code>
登入後複製

將此函數應用於程式碼片段:

<code class="go">func1 := func() { f(0) }
func2 := func() { f(1) }
func3 := func() { f(2) }

Parallelize(func1, func2, func3)</code>
登入後複製

以上是如何在 Golang 中實現真正的並行:Goroutines、死鎖和通道?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!