Golang Go语言中的多 goroutine 问题

发布于 1周前 作者 vueper 来自 Go语言
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

8 回复

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 就好。

看看 WaitGroup 的用法

以下代码仅供参考
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也带来了一些需要特别注意的问题,主要包括数据竞争、死锁和资源泄露等。

  1. 数据竞争:当多个goroutine同时读写共享数据时,就可能发生数据竞争,导致程序行为不确定。为解决这个问题,可以使用Go的sync包中的互斥锁(sync.Mutex)或读写锁(sync.RWMutex)来保护共享数据。

  2. 死锁:死锁是指两个或多个goroutine因相互等待对方释放资源而无法继续执行的状态。为了避免死锁,需要确保每个goroutine在获取资源后,最终都能释放资源。此外,还可以使用Go的context包来管理goroutine的生命周期,避免长时间等待。

  3. 资源泄露:在创建大量goroutine时,如果未正确管理它们的生命周期,可能会导致资源泄露。例如,未关闭的通道(channel)或文件句柄会占用系统资源。因此,在使用完资源后,应及时关闭或释放它们。

总的来说,处理多goroutine问题时,需要仔细考虑数据同步、资源管理和goroutine生命周期管理等方面。Go语言提供了一些强大的工具(如sync包、context包等)来帮助开发者解决这些问题。通过合理使用这些工具,可以编写出高效、稳定且易于维护的并发程序。

回到顶部