go语言中协程与主线程退出逻辑是三种处理方式及示例代码

2023-06-01 00:00:00 示例 主线 三种

如何实现go协程执行完之后,主协程在结束当前程序?


方式1:

是用channel实现。

根据协程数量,设置一个有缓冲区的channel,当channel的长度为0时,则表示协程执行结束。

package main

import (
 "fmt"
"time"
)

var channel = make(chan int, 1)

func goroutines() {
for i := 0; i < 100; i++ {
fmt.Println("go程", i)
}
 
channel <- 1
close(channel)

func main() {
go goroutines()
for {
val, status := <-channel

fmt.Println(val)
if !status {
fmt.Println("channel closed!")
break
}
}
}


方式2:

使用sync.WiatGroup实现。

通过计数器实现,开启协程是wg.Wait()会一直处于阻塞状态。

当协程执行完之后,对计数器-1,直到为0的时候,自动退出。

一定要在Wait()执行之前,使用Add()。

不要在协程内部中去执行Add(),这样容易导致在执行到Wait()时,可能协程还未来得及执行Add()。

package main

import (
"fmt"
"sync"
)

func goroutines() {
for i := 0; i < 100; i++ {
fmt.Println("go程", i)
}
wg.Done()
}

var wg sync.WaitGroup

func main() {
wg.Add(1)

go goroutines()

wg.Wait()
}


方式3:

使用sleep()方式实现。

package main

import (
 "fmt"
"time"
)

func goroutines() {
for i := 0; i < 100; i++ {
fmt.Println("go程", i)
}
}

func main() {
go goroutines()
time.Sleep(time.Second * 5)
}

ps:

sleep()时间不好掌握,如果协程执行时间长,设置的时间短,导致协程还未执行结束完,主线程就退出。如果协程执行时间短,此时主线程就会一直等待,直到设置的时间,浪费资源。

相关文章