什么是 Goroutine?你如何停止它?
什么是 Goroutine?你如何停止它?
一个 Goroutine 是一个函数或方法执行同时旁边其他任何够程采用了特殊的 Goroutine 线程。Goroutine 线程比标准线程更轻量级,大多数 Golang 程序 同时使用数千个 Goroutine。
要创建 Goroutine,请 go 在函数声明之前添加关键字。
go f(x, y, z)
您可以通过向 Goroutine 发送一个信号通道来停止它。Goroutines 只能在被 告知检查时响应信号,因此您需要在逻辑位置(例如 for 循环顶部)包含检查。 Goroutine示例代码如下:
package main func main() {
quit := make(chan bool) go func() {
for {
select {
case <-quit:
return default:
// … }
}
}()
// …
quit <- true }
什么是 Goroutine?
Goroutine 是 Go 语言中的一个并发体,它比线程更轻量级,由 Go 运行时(runtime)管理。Goroutine 的调度是由 Go 的运行时系统处理的,这使得创建成千上万的 Goroutine 成为可能,而不需要担心传统的线程创建和销毁所带来的开销。Goroutine 的设计使得编写并发程序变得更加简单和高效。
示例代码:
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world") // 在新的 Goroutine 中执行 say 函数
say("hello") // 在当前 Goroutine 中执行
}
如何停止 Goroutine?
由于 Goroutine 是由 Go 运行时直接管理的,并没有直接的方法来“停止”一个 Goroutine。不过,你可以通过几种方式间接地控制或停止 Goroutine 的执行:
-
使用通道(Channel)进行通信:通过发送信号(如关闭通道或发送特定值)到 Goroutine 监听的通道,让 Goroutine 内部根据接收到的信号来决定是否继续执行。
-
使用上下文(Context):
context.Context
类型用于在不同 Goroutine 之间传递取消信号、超时时间和截止日期等。它是 Go 标准库推荐的用于控制并发操作的方法。
示例代码:使用通道停止 Goroutine
package main
import (
"fmt"
"time"
)
func worker(done chan bool) {
fmt.Println("Working...")
time.Sleep(time.Second)
fmt.Println("Done")
// 检查通道是否已关闭或接收到信号
<-done
}
func main() {
done := make(chan bool, 1)
go worker(done)
time.Sleep(time.Millisecond * 500) // 假设我们决定在0.5秒后停止 worker
close(done) // 关闭通道以通知 worker 停止
// 注意:这里我们没有等待 worker 完成,因为它在接收到关闭的通道时会立即退出。
// 如果需要等待,可以在关闭通道后,使用 sync.WaitGroup 或其他机制来等待。
}
注意:在这个例子中,我们只是简单地通过关闭通道来“通知”worker
函数可以停止了。但是,如果worker
函数中有循环或其他长时间运行的操作,它应该检查通道的状态(比如是否关闭或接收到特定的值),以决定是否继续执行。在实际应用中,可能需要更复杂的逻辑来处理各种并发场景。