技术文摘
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函数 并发运行
- 苹果 Mac 系统修改默认邮箱的图文教程
- 苹果 macOS 加密文件夹创建方法及图文教程
- macOS Sierra 10.12.2 Beta1 升级方法及图文教程
- Mac 音量无法调节的两种解决办法
- Mac App Store 已购项目隐藏与取消隐藏步骤解析
- 苹果 Mac 电脑软件安装提示来自不明开发者无法打开的解决图文教程
- Mac 上如何让网易云音乐歌词在多个桌面显示
- Mac 系统默认播放器如何更改
- OS X 与 Sketch 自定义快捷键的方法一览
- macOS 10.12 Beta 7 的更新内容汇总
- Apple Watch 解锁 Mac 的图文教程详解
- 如何在 Mac 上粘贴 iPhone 复制的内容
- 如何在 Mac 系统中为 PDF 文档添加目录
- Mac 终端开启/关闭 SSH 的方法及新手教程
- 苹果 Mac 完全删除文件的技巧