乐闻世界logo
搜索文章和话题

在 Golang 中,什么是 Goroutine ,如何阻止它?

2 个月前提问
2 个月前修改
浏览次数21

1个答案

1

Goroutine是Go语言中的一种轻量级线程,由Go的运行时(runtime)环境管理。Goroutine在执行上比传统的线程更加高效,它允许数以万计的Goroutine同时运行在一个或几个操作系统线程上。

什么是Goroutine?

Goroutine是通过Go语言的go关键字来启动的,它会让函数或者方法在同一地址空间中并发地运行。每个Goroutine都会占用极小的内存,这也是它能够支持创建成千上万个Goroutine的原因。而传统的线程通常占用较大的内存,限制了它们数量的扩展。

例如,下面的Go代码展示了如何使用Goroutine:

go
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") say("hello") }

在上述代码中,go say("world")这一行代码会启动一个新的Goroutine。这意味着say("world")say("hello")将会并发执行。

如何阻止Goroutine?

在Go语言中,没有直接终止或停止Goroutine的原生支持方法。如果需要停止Goroutine,通常的做法是使用通道(channel)来发送一个信号给Goroutine,告知它何时停止执行。

以下是一个示例,它展示了如何使用通道来阻止Goroutine:

go
package main import ( "fmt" "time" ) func cleanup() { fmt.Println("Doing some cleaning...") } func worker(stopCh <-chan bool) { for { select { case <-stopCh: cleanup() return default: fmt.Println("working...") time.Sleep(500 * time.Millisecond) } } } func main() { stopCh := make(chan bool) go worker(stopCh) time.Sleep(2 * time.Second) stopCh <- true fmt.Println("Stopped worker!") }

在这个例子中,worker函数在一个循环内运行,并通过select语句监听stopCh通道的信号。当从stopCh通道接收到信号时,它调用cleanup函数来执行清理工作,然后返回以停止Goroutine的执行。

这种方法通过协作的方式让Goroutine有序地停止运行,从而避免了使用强制停止可能引起的资源泄漏或不一致状态。

2024年7月20日 03:19 回复

你的答案