Golang Go语言中的多 goroutine 问题
package main import ( "fmt" )func main(){ var str = []string {“1”, “2”, “1”,“1”, “2”,“1”, “2”, “1”,“1”, “2”,“1”, “2”, “1”,“1”, “2”,“1”, “2”, “1”,“1”, “2”, “0”, “6”,“9”,“4”} for _, t := range str { switch t { case “1”: go go1(t) case “2”: go go2(t) default: // } }
fmt.Println("hello")
}
func go1(st string) { //逻辑处理 fmt.Println(st) } func go2(st string){ //逻辑处理 fmt.Println(st) }
我开启 2 个 goroutine , 但是我不知道如何做堵塞,确保 2 个 goroutine 都运行完后在退出主 goroutine 。开始的时候我用 channel 加 计数器去实现,这样的话就需要给函数添加一个参数:
func go1(st string, ch chan bool){ //逻辑处理 } func go2(st string, ch chan bool){ //逻辑处理 } func main(){ //省略一些代码 for { <- ch t ++ if t >= len(str) { break } } }
我想问问, 能不能有更简介明了的办法去实现。
Golang Go语言中的多 goroutine 问题
更多关于Golang Go语言中的多 goroutine 问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go 语言 WaitGroup 用法
http://www.baiyuxiong.com/?p=913
更多关于Golang Go语言中的多 goroutine 问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
sync 包有个 WaitGroup 可以满足你的需要。
看上去你这个好像不止会产生两个 goroutine 哦。。。
对的使用 WaitGroup 可以实现。
有 for 产生很多多 goroutine 的,
我想使用一个全局的 channel 来实现。
https://golang.org/doc%2Fcodewalk%2Furlpoll.go
这里貌似有个 Poller 函数,是不是你想要的?
想停下 goroutine 的话,发送端 close 就好。
以下代码仅供参考
package main
import (
“fmt”
“runtime”
)
func main() {
data := []int{1, 8, 6, 7, 20}
NumCPU := runtime.NumCPU()
fmt.Println(“NumCPU:”, NumCPU)
sem := make(chan int, NumCPU)
for _, value := range data {
if value%2 == 0 {
go func(param int) {
sem <- param
fmt.Println(“oushu:”, param)
}(value)
} else {
go func(param int) {
sem <- param
fmt.Println(“jishu:”, param)
}(value)
}
}
for i := 0; i < len(data); i++ {
<-sem
}
}
在Golang(Go语言)中,多goroutine并发编程是其一大亮点,它使得开发者能够高效地处理并发任务。然而,多goroutine也带来了一些需要特别注意的问题,主要包括数据竞争、死锁和资源泄露等。
-
数据竞争:当多个goroutine同时读写共享数据时,就可能发生数据竞争,导致程序行为不确定。为解决这个问题,可以使用Go的
sync
包中的互斥锁(sync.Mutex
)或读写锁(sync.RWMutex
)来保护共享数据。 -
死锁:死锁是指两个或多个goroutine因相互等待对方释放资源而无法继续执行的状态。为了避免死锁,需要确保每个goroutine在获取资源后,最终都能释放资源。此外,还可以使用Go的
context
包来管理goroutine的生命周期,避免长时间等待。 -
资源泄露:在创建大量goroutine时,如果未正确管理它们的生命周期,可能会导致资源泄露。例如,未关闭的通道(channel)或文件句柄会占用系统资源。因此,在使用完资源后,应及时关闭或释放它们。
总的来说,处理多goroutine问题时,需要仔细考虑数据同步、资源管理和goroutine生命周期管理等方面。Go语言提供了一些强大的工具(如sync
包、context
包等)来帮助开发者解决这些问题。通过合理使用这些工具,可以编写出高效、稳定且易于维护的并发程序。