gpt4 book ai didi

go - 我应该关心在我的 go 库中提供异步调用吗?

转载 作者:IT王子 更新时间:2023-10-29 01:38:56 26 4
gpt4 key购买 nike

我正在为基于 http 的 jsonrpc 开发一个简单的 go 库。

有以下方法:

rpcClient.Call("myMethod", myParam1, myParam2)

此方法在内部执行 http.Get() 并返回结果或错误(元组)。

这对于调用者来说当然是同步的,并在 Get() 调用返回时返回。

这是在go中提供库的方式吗?如果她愿意,我是否应该将它留给我的图书馆的用户使其异步?

或者我应该提供第二个函数:

rpcClient.CallAsync()

并在这里返回一个 channel ?因为 channel 无法提供元组,所以我必须将 (response, error) 元组打包到一个结构中,然后返回该结构。

这有意义吗?

否则用户将不得不用丑陋的方法包装每个调用,例如:

result := make(chan AsyncResponse)
go func() {
res, err := rpcClient.Call("myMethod", myParam1, myParam2)
result <- AsyncResponse{res, err}
}()

Go 库和异步有最佳实践吗?

最佳答案

go 的执行模型的全部要点是对开发人员隐藏异步操作,并且表现得像具有阻塞操作的线程模型。在幕后有绿色线程和异步 IO 以及一个非常复杂的调度程序。

所以不,您不应该向您的库提供异步 API。从代码的角度来看,go 中的网络以伪阻塞的方式完成,您可以根据需要打开尽可能多的 goroutine,因为它们非常便宜。

所以你的最后一个例子是要走的路,我不认为它丑陋。因为它允许开发者选择并发模型。在 http 服务器的上下文中,每个命令都在单独的 goroutine 中处理,我只调用 rpcClient.Call("myMethod", myParam1, myParam2)

或者如果我想要扇出 - 我将创建扇出逻辑。

您还可以创建一个方便的函数来执行调用并在 channel 上返回:

func CallAsync(method, p1, p2) chan AsyncResponse {
result := make(chan AsyncResponse)
go func() {
res, err := rpcClient.Call(method, p1, p2)
result <- AsyncResponse{res, err}
}()
return result
}

关于go - 我应该关心在我的 go 库中提供异步调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40572645/

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