最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • Golang 函数中 goroutine 的创建和管理

    go语言中,创建goroutine使用go关键字加函数调用。管理goroutine时,使用sync.waitgroup进行同步;使用context包可取消goroutine。实战中可用于并行处理网络请求、图片处理等任务。

    Golang 函数中 goroutine 的创建和管理

    Golang 函数中 goroutine 的创建和管理

    Goroutine(协程)是 Go 语言中的轻量级并行执行单元,可以在单个线程中同时并发运行多个任务。

    创建 Goroutine

    创建一个 goroutine 非常简单,可以使用 go 关键字后跟一个函数调用即可:

    func hello() {
        fmt.Println("Hello from goroutine")
    }
    
    func main() {
        go hello() // 创建一个执行 hello() 函数的 goroutine
    }

    Goroutine 管理

    同步

    在处理共享资源时,需要对 goroutine 进行同步。使用 sync.WaitGroup 可以等待一组 goroutine 完成:

    var wg sync.WaitGroup
    
    func hello(name string) {
        wg.Add(1)
        defer wg.Done()
    
        fmt.Println("Hello", name)
    }
    
    func main() {
        wg.Add(3)
        go hello("John")
        go hello("Mary")
        go hello("Bob")
        wg.Wait() // 等待所有 goroutine 完成
    }

    取消

    可以使用 context 包取消 goroutine:

    import (
        "context"
        "fmt"
        "time"
    )
    
    func heavyComputation(ctx context.Context) {
        for {
            select {
            case <-ctx.Done():
                fmt.Println("Computation cancelled")
                return
            default:
                // 执行计算
            }
        }
    }
    
    func main() {
        ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
        defer cancel()
    
        go heavyComputation(ctx)
        time.Sleep(10 * time.Second) // 10 秒后取消计算
    }

    实战案例

    并行处理网络请求:

    func main() {
        urls := []string{"https://example.com", "https://example.net", "https://example.org"}
    
        var wg sync.WaitGroup
    
        for _, url := range urls {
            wg.Add(1)
            go func(url string) {
                resp, err := http.Get(url)
                if err != nil {
                    log.Fatal(err)
                }
    
                resp.Body.Close()
                wg.Done()
            }(url)
        }
    
        wg.Wait()
    }

    并行处理图片处理:

    func main() {
        images := []string{"image1.jpg", "image2.jpg", "image3.jpg"}
    
        var wg sync.WaitGroup
    
        for _, image := range images {
            wg.Add(1)
            go func(image string) {
                img, err := image.Decode(image)
                if err != nil {
                    log.Fatal(err)
                }
    
                // 处理图像
    
                wg.Done()
            }(image)
        }
    
        wg.Wait()
    }
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » Golang 函数中 goroutine 的创建和管理
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 294稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情