Golang函数中多个goroutine如何并发运行

2025-01-09 03:57:27   小编

Golang函数中多个goroutine如何并发运行

在Golang编程中,并发是其一大优势,通过goroutine可以轻松实现多个任务的并发执行。理解如何在函数中让多个goroutine并发运行,能极大提升程序的性能与效率。

创建一个简单的函数,我们可以在这个函数内部启动多个goroutine。例如:

package main

import (
    "fmt"
    "time"
)

func worker(id int) {
    fmt.Printf("Worker %d starting\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    for i := 1; i <= 3; i++ {
        go worker(i)
    }
    time.Sleep(2 * time.Second)
    fmt.Println("Main function exiting")
}

在这段代码中,main函数里通过for循环启动了3个goroutine,每个goroutine都执行worker函数。worker函数模拟了一个耗时的任务,通过time.Sleep暂停一秒来模拟实际工作。

这里需要注意的是,在main函数中添加了time.Sleep(2 * time.Second)。这是因为Golang的main函数是一个goroutine,如果main函数结束,所有正在运行的goroutine都会被终止。所以通过time.Sleepmain函数等待足够的时间,以确保其他goroutine有机会完成任务。

另外,当多个goroutine需要共享资源时,就会涉及到资源竞争的问题。例如,多个goroutine同时对一个全局变量进行读写操作,可能会导致数据不一致。为了解决这个问题,Golang提供了sync包。

package main

import (
    "fmt"
    "sync"
)

var counter int
var mu sync.Mutex

func increment() {
    mu.Lock()
    counter++
    mu.Unlock()
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }
    wg.Wait()
    fmt.Println("Final counter value:", counter)
}

在这个例子中,通过sync.Mutex来保护counter变量,确保在多个goroutine并发访问时数据的一致性。sync.WaitGroup则用于等待所有的goroutine完成任务。

在Golang函数中实现多个goroutine并发运行,要合理安排任务执行逻辑,注意避免资源竞争等问题,充分利用Golang强大的并发特性来构建高效稳定的程序。

TAGS: 多个goroutine Golang并发 Golang函数 并发运行

欢迎使用万千站长工具!

Welcome to www.zzTool.com