gpt4 book ai didi

go - 同步Go Routines需要什么

转载 作者:数据小太阳 更新时间:2023-10-29 03:45:31 24 4
gpt4 key购买 nike

这个特殊的 Go 代码使用一个 channel 来同步 goroutines

// We can use channels to synchronize execution
// across goroutines. Here's an example of using a
// blocking receive to wait for a goroutine to finish.

package main

import "fmt"
import "time"

// This is the function we'll run in a goroutine. The
// `done` channel will be used to notify another
// goroutine that this function's work is done.
func worker(done chan bool) {
fmt.Print("working...")
time.Sleep(time.Second)
fmt.Println("done")

// Send a value to notify that we're done.
done <- true
}

func main() {

// Start a worker goroutine, giving it the channel to
// notify on.
done := make(chan bool, 1)
go worker(done)

// Block until we receive a notification from the
// worker on the channel.
<-done
}

同步goroutines需要什么?不是我们将以交错方式运行 goroutines 的想法。为什么我们要在两个或多个 go 例程之间引入同步?是否用于回调?

谢谢

最佳答案

并发不会凭空发生。出于多种原因,可能需要协调您启动的 goroutines。在这种情况下,有一个主要的(超出示例,它被设计为演示):

  • 如果到达 main 方法的末尾,Go 运行时将退出。届时,包括所有其他 goroutines 在内的正在运行的程序将被终止。此处的协调确保子 goroutine 在允许程序退出之前已停止。

    我昨天写了一个这样的例子:https://stackoverflow.com/a/52347990/1113760 .

您可能会想到许多其他需要在并发工作之间进行协调的原因(此列表并非特定于 Go 且并非详尽无遗):

  • goroutines 在共享内存区域上运行,因此需要以互斥的形式进行协调,以确保一次只有一个例程访问临界区。

  • 您的后续处理可能取决于多个 goroutine 的输出,因此您在继续之前等待达成共识。

  • 您的程序可能会提供一项服务,您希望确保任何运行中的请求(在单独的 goroutine 中处理)在您关闭之前已完成并耗尽。

这个问题超出了 Go 的范围,考虑了与并发执行相关的计算机科学困难,以及它有用的实例,因此文献将有更多的细节和示例。

关于go - 同步Go Routines需要什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52351812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com