技术文摘
Golang函数中多个goroutine如何并发运行
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.Sleep让main函数等待足够的时间,以确保其他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函数 并发运行
- PHP实现将MySQL数据库中的名单展示到前端的方法
- 获取Firefox配置文件目录路径的方法
- 如何确定Python列表数组的容量
- Go 中怎样创建类似 Java 泛型数组的结构
- Go语言ORM框架实力较量:GORM、XORM、Beego ORM谁更强
- 简易可编程控制器云端管理系统的开发
- 用Python从数据集中分割训练和测试数据的学习
- Go二维数组处理:怎样防止append函数修改其他元素
- 在GitHub上运行Go脚本的方法
- 爬虫开发避免数据丢失:请求失败自动排队与重试方法
- Go中创建包含不同数据类型数组的方法
- 多进程for循环下如何确保所有子进程完成后再执行主进程代码
- 监控App推送通知的方法
- 与后端开发者有效沟通,避开项目困境的方法
- Go反射中Elem()方法对指向指针对象的指针的操作方法