技术文摘
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函数 并发运行
- CSS选择器与原生JS操作DOM:非p元素及偶数位置p元素的选择方法,以及HTML的插入与删除操作
- JavaScript 怎样获取上传图片的绝对路径
- 博客园编辑器所用组件究竟有哪些
- ECharts中绘制类似光发的3D图方法
- React 组件中无法获得 Tailwind CSS 语法提示的原因
- PHP 接口数据 AJAX 无法获取但 Postman 和直接访问 URL 能获取,如何解决
- 怎样用正则表达式实现文本自动断句
- 冒泡排序数组打印异常:元素交换前后打印数组结果为何不一致
- HTML与CSS初学者教程:列表、表格、表单、高级CSS选择器及网页设计
- TailwindCSS中line-height和leading属性失效原因及元素垂直居中方法
- Webpack打包后尾部windcss类名未被打包问题的解决方法
- Yii中confirm选项有时不弹出弹框的原因
- 原生JS修改页面滚动距离与速度,实现一次滑动移动400px方法
- 博客园编辑器的秘密武器:探究其所用组件
- TailwindCSS 中 line-height 和 leading 不生效怎么办?怎样实现垂直居中?