启动一个go routine并等待执行完

在Go语言中,启动一个goroutine(即轻量级的线程)非常简单,只需在函数调用前加上go关键字即可。然而,如果你想等待一个或多个goroutine执行完成,你通常需要使用某种同步机制,如sync.WaitGroup、通道(channel)或互斥锁(mutex)结合条件变量(condition variable)。

下面是一个使用sync.WaitGroup等待goroutine执行完成的示例:

package main  
  
import (  
	"fmt"  
	"sync"  
	"time"  
)  
  
func worker(id int, wg *sync.WaitGroup) {  
	defer wg.Done() // 在goroutine结束时调用Done来通知WaitGroup  
	fmt.Printf("Worker %d starting\n", id)  
	time.Sleep(time.Second * 2) // 模拟工作  
	fmt.Printf("Worker %d done\n", id)  
}  
  
func main() {  
	var wg sync.WaitGroup  
  
	// 启动3个goroutine  
	for i := 1; i <= 3; i++ {  
		wg.Add(1) // 为每个goroutine增加WaitGroup的计数器  
		go worker(i, &wg) // 启动goroutine  
	}  
  
	// 等待所有goroutine执行完成  
	wg.Wait()  
	fmt.Println("All workers have finished")  
}

在这个例子中,我们定义了一个worker函数,它接收一个ID和一个指向sync.WaitGroup的指针。在main函数中,我们创建了一个sync.WaitGroup实例,并使用一个for循环启动了3个goroutine。对于每个goroutine,我们都调用wg.Add(1)来增加WaitGroup的计数器。在goroutine内部,我们使用defer wg.Done()来确保在goroutine结束时调用Done方法,这将减少WaitGroup的计数器。最后,在main函数中,我们调用wg.Wait()来阻塞,直到所有goroutine都调用了Done方法,即所有goroutine都执行完成。

Was this helpful?

0 / 0

发表回复 0