面试题答案
一键面试Goroutine的作用
- 并发处理请求:在Go语言的RPC实现中,Goroutine允许RPC服务端同时处理多个客户端请求。当一个客户端连接并发送请求时,服务端可以启动一个新的Goroutine来处理该请求,这样就不会阻塞其他请求的处理,从而实现高并发处理。
- 独立执行任务:每个Goroutine可以独立地执行RPC方法。比如,当客户端请求一个复杂的计算任务时,Goroutine可以在后台执行这个计算,而不会影响服务端对其他请求的响应。
通道的作用
- 请求与响应传递:通道可以用于在不同的Goroutine之间传递请求和响应数据。例如,服务端的监听Goroutine接收到客户端请求后,可以通过通道将请求数据发送给负责处理具体业务逻辑的Goroutine。处理完成后,该Goroutine又可以通过通道将响应数据返回给负责发送响应的Goroutine。
- 同步与通信:通道还能用于Goroutine之间的同步。比如,一个Goroutine在处理完请求后,通过通道通知另一个Goroutine可以发送响应了,确保各个Goroutine之间有序协作。
简单RPC服务中使用Goroutine和通道处理请求并返回响应示例
package main
import (
"fmt"
)
// 模拟请求结构体
type Request struct {
Num1 int
Num2 int
}
// 模拟响应结构体
type Response struct {
Result int
}
func main() {
requestCh := make(chan Request)
responseCh := make(chan Response)
// 启动处理请求的Goroutine
go func() {
for req := range requestCh {
res := Response{Result: req.Num1 + req.Num2}
responseCh <- res
}
}()
// 模拟客户端请求
req := Request{Num1: 3, Num2: 5}
requestCh <- req
// 获取响应
res := <-responseCh
fmt.Printf("Response: %d\n", res.Result)
close(requestCh)
close(responseCh)
}
在上述示例中:
- Goroutine使用:启动了一个Goroutine来处理从
requestCh
通道接收到的请求,它独立于主Goroutine运行,实现并发处理能力。 - 通道使用:
requestCh
通道用于传递客户端请求,responseCh
通道用于传递处理后的响应。通过这种方式,实现了请求的接收、处理以及响应的返回过程。