首页 > 后端开发 > Golang > 正文

与单独使用 goroutine 相比,通道和单独的工作线程如何提高 Go 中的并行性?

Mary-Kate Olsen
发布: 2024-11-05 03:48:02
原创
410 人浏览过

How can channels and separate workers improve parallelism in Go compared to using goroutines alone?

Go 中的并行处理

并行编程涉及同时执行多个任务,从而可以提高可分为独立单元的应用程序的性能。 Go 中实现并行性的一种方法是通过 goroutine,即与主程序并发执行的轻量级线程。

考虑以下代码:

<code class="go">package main

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

func main() {
    for i := 0; i < 3; i++ {
        go f(i)
    }

    // prevent main from exiting immediately
    var input string
    fmt.Scanln(&input)
}

func f(n int) {
    for i := 0; i < 10; i++ {
        dowork(n, i)
        amt := time.Duration(rand.Intn(250))
        time.Sleep(time.Millisecond * amt)
    }
}

func dowork(goroutine, loopindex int) {
    // simulate work
    time.Sleep(time.Second * time.Duration(5))
    fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex)
}</code>
登录后复制

此代码使用 goroutine 并发执行 f函数三次。 dowork 函数通过休眠 5 秒来模拟一些工作。

你能假设 dowork 函数会并行执行吗?

是的,你可以做出这个假设。默认情况下,Go 将 GOMAXPROCS 设置为可用核心数,这允许多个 goroutine 并发执行。

这是实现并行性的正确方法吗?

这是实现并行性的有效方法,但它可能不是最有效的方法。使用没有同步机制的 goroutine 可能会导致数据竞争和不正确的结果。

使用通道和单独的 dowork Workers

实现并行性的一种更加结构化和可扩展的方法是使用渠道和单独的 dowork 工作人员。这种方法确保每个 goroutine 都有自己的共享数据副本,并通过消息传递进行通信。

这是一个使用通道的示例:

<code class="go">var results = make(chan int) // channel to collect results

func main() {
    // spawn a worker for each goroutine
    for i := 0; i < 3; i++ {
        go worker(i)
    }

    // collect results from the worker goroutines
    for i := 0; i < 10; i++ {
        result := <-results
        fmt.Println("Received result:", result)
    }
}

func worker(n int) {
    for i := 0; i < 10; i++ {
        // perform work and send result through the channel
        res := dowork(n, i)
        results <- res
    }
}</code>
登录后复制

结论

Go 中的并行性可以通过 goroutine 来实现。使用通道和单独的工作人员是一种更加结构化和可扩展的方法,可以确保数据完整性并提高性能。

以上是与单独使用 goroutine 相比,通道和单独的工作线程如何提高 Go 中的并行性?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!