我是否应该关心在我的go库中提供异步调用?
我正在为http上的jsonrpc开发一个简单的go库 有以下方法:我是否应该关心在我的go库中提供异步调用?,go,Go,我正在为http上的jsonrpc开发一个简单的go库 有以下方法: rpcClient.Call("myMethod", myParam1, myParam2) 此方法在内部执行http.Get()并返回结果或错误(元组) 这当然是调用方的synchron,并在Get()调用返回时返回 这是在围棋中提供图书馆的方式吗?如果我的库的用户愿意的话,我是否应该让它成为异步的呢 或者我应该提供第二个函数,称为: rpcClient.CallAsync() 在这里返回一个频道?因为通道不能提供元组,
rpcClient.Call("myMethod", myParam1, myParam2)
此方法在内部执行http.Get()并返回结果或错误(元组)
这当然是调用方的synchron,并在Get()调用返回时返回
这是在围棋中提供图书馆的方式吗?如果我的库的用户愿意的话,我是否应该让它成为异步的呢
或者我应该提供第二个函数,称为:
rpcClient.CallAsync()
在这里返回一个频道?因为通道不能提供元组,所以我必须将(响应、错误)元组打包到一个结构中,并返回该结构
这有意义吗
否则,用户将不得不用一个丑陋的方法包装每个调用,如:
result := make(chan AsyncResponse)
go func() {
res, err := rpcClient.Call("myMethod", myParam1, myParam2)
result <- AsyncResponse{res, err}
}()
result:=make(响应)
go func(){
res,err:=rpcClient.Call(“myMethod”,myParam1,myParam2)
结果go的执行模型的全部要点是对开发人员隐藏异步操作,其行为类似于带有阻塞操作的线程模型。在幕后有绿色线程、异步IO和非常复杂的调度程序
因此,不应该为库提供异步API。从代码的角度来看,go中的联网是以伪阻塞的方式完成的,您可以根据需要打开任意多个Goroutine,因为它们非常便宜
这样,你的最后一个例子就是方法,我不认为它是丑陋的。因为它允许开发者选择并发模型。在HTTP服务器的上下文中,每个命令都在单独的GOODUTE中处理,我只调用<代码> RPCclipse。调用(“MyMead”,MyPARAM1,MyPARAM2)< /COD> < /P>
或者,如果我想要扇出,我将创建扇出逻辑
您还可以创建一个方便的函数,用于在通道上执行调用和返回:
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
}
func CallAsync(方法,p1,p2)chan async响应{
结果:=生成(响应)
go func(){
res,err:=rpcClient.Call(方法,p1,p2)
后果