I go have the below code that is working fine, and the goroutine is running 5 times as requested.
package main
import (
"fmt"
"log"
"sync"
pb "walistner/proto"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/peer"
"google.golang.org/protobuf/types/known/emptypb"
)
// type server pb.StreamServiceServer
type server struct {
pb.UnimplementedStreamServiceServer
}
func (s server) WaMessageStreame(_ *emptypb.Empty, srv pb.StreamService_WaMessageStreameServer) error {
if p, ok := peer.FromContext(srv.Context()); ok {
fmt.Println("Client ip is:", p.Addr.String())
}
md := metadata.New(map[string]string{"Content-Type": "text/event-stream", "Connection": "keep-alive"})
srv.SetHeader(md)
//use wait group to allow process to be concurrent
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(count int64) {
defer wg.Done()
resp := myData
if err := srv.Send(&resp); err != nil {
log.Printf("send error %v", err)
}
log.Printf("finishing request number : %d", count)
}(int64(i))
}
wg.Wait()
return nil
}
I wanted to make slight change, so instead of running 5 times only, I want it to run upon recieving input data from channel, so I changed it to be:
for { // removed the count
wg.Add(1)
go func() {
defer wg.Done()
resp := <- myData // I changed mydata to be from channel
if err := srv.Send(&resp); err != nil {
log.Printf("send error %v", err)
}
}()
But with this change I got the app hang/freezed.
What mistake I made?