gpt4 book ai didi

concurrency - 在处理 3rd 方代码时,如何知道在 Go 中会同时发生什么

转载 作者:IT王子 更新时间:2023-10-29 01:43:13 25 4
gpt4 key购买 nike

假设我在我的网络服务器中使用一个名为 github.com/john/jupiterDb 的虚构包,我用它连接到我在 Jupiter 上托管的数据库。

当有人向我的服务器发出请求时,我想将请求的主体存储在我的 Jupiter 数据库中。所以我有一些这样的代码:

http.HandleFunc("/SomeEvent", registerSomeEvent)

在我的 registerSomeEvent 处理程序中,我想这样做:

func registerSomeEvent(w http.ResponseWriter, r *http.Request) {
jupiterDb.Insert(r.Body) // Takes a while!
fmt.FPrint(w, "Thanks!")
}

现在显然我不想等到木星的往返旅行来感谢我的用户。因此,显而易见的 Go 要做的事情是将 Insert 调用包装在一个 go 例程中。

但是通常执行冗长 IO 的包的创建者会在包中使用 go routines 来确保这些函数立即返回并且是非阻塞的。这是否意味着我需要检查我使用的每个包的源以确保我正确使用并发?

无论如何我应该将它包装在一个额外的 go 例程中,还是我应该相信维护者已经为我完成了工作?这感觉好像我无法将包裹视为黑盒子,或者我错过了什么?

最佳答案

我只会阅读正文并将其发送到 channel 。一组 goroutine 将从 channel 中读取数据并将有效载荷发送到 jupiter。

var reqPayloadChannel = make(chan string, 100)

func jupiter_worker() {
for payload := range reqPayloadChannel {
jupiterDb.Insert(payload) // Takes a while!
}
}

func registerSomeEvent(w http.ResponseWriter, r *http.Request) {
reqPayloadChannel <- r.Body.ReadAll()
fmt.Fprint(w, "Thanks!")
}

接下来的步骤是设置工作组并处理由于客户端非常慢而导致 jupiter channel 已满的情况。

关于concurrency - 在处理 3rd 方代码时,如何知道在 Go 中会同时发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23922529/

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