gRPC实现异步请求的Go代码
时间: 2023-05-26 10:06:29 浏览: 71
package main
import (
"context"
"fmt"
"io"
"log"
"time"
"github.com/golang/protobuf/ptypes/empty"
"google.golang.org/grpc"
pb "grpc_async_demo/protos"
)
const (
address = "localhost:50051"
)
func main() {
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("failed to dial: %v", err)
}
defer conn.Close()
client := pb.NewEchoServiceClient(conn)
runBidirectionalStreaming(client)
}
func runBidirectionalStreaming(client pb.EchoServiceClient) {
stream, err := client.BidirectionalStreaming(context.Background())
if err != nil {
log.Fatalf("failed to create stream: %v", err)
}
done := make(chan bool)
go func() {
for {
resp, err := stream.Recv()
if err == io.EOF {
// done
done <- true
return
}
if err != nil {
log.Fatalf("failed to recv: %v", err)
}
fmt.Printf("Received response: '%s'\n", resp.Message)
}
}()
for i := 0; i < 10; i++ {
msg := fmt.Sprintf("hello async request #%d", i)
if err := stream.Send(&pb.EchoRequest{Message: msg}); err != nil {
log.Fatalf("failed to send: %v", err)
}
fmt.Printf("Sent request: '%s'\n", msg)
time.Sleep(time.Second)
}
stream.CloseSend()
<-done
}
func runUnaryAsync(client pb.EchoServiceClient) {
for i := 0; i < 10; i++ {
msg := fmt.Sprintf("hello async request #%d", i)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
defer cancel()
resp, err := client.UnaryAsync(ctx, &pb.EchoRequest{Message: msg})
if err != nil {
log.Fatalf("failed to unary async: %v", err)
}
fmt.Printf("Received response: '%s'\n", resp.Message)
time.Sleep(time.Second)
}
}
func runUnarySync(client pb.EchoServiceClient) {
for i := 0; i < 10; i++ {
msg := fmt.Sprintf("hello sync request #%d", i)
resp, err := client.UnarySync(context.Background(), &pb.EchoRequest{Message: msg})
if err != nil {
log.Fatalf("failed to unary sync: %v", err)
}
fmt.Printf("Received response: '%s'\n", resp.Message)
time.Sleep(time.Second)
}
}
func runVoid(client pb.EchoServiceClient) {
resp, err := client.VoidMethod(context.Background(), &empty.Empty{})
if err != nil {
log.Fatalf("failed to void method: %v", err)
}
fmt.Printf("Received response: '%s'\n", resp.Message)
}
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)