github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/23_proto_actor/remotelatency/node2/main.go (about) 1 package main 2 3 import ( 4 "log" 5 "runtime" 6 "sort" 7 "time" 8 9 "fmt" 10 11 console "github.com/AsynkronIT/goconsole" 12 "github.com/AsynkronIT/protoactor-go/actor" 13 "github.com/AsynkronIT/protoactor-go/examples/remotelatency/messages" 14 "github.com/AsynkronIT/protoactor-go/mailbox" 15 "github.com/AsynkronIT/protoactor-go/remote" 16 ) 17 18 type remoteActor struct { 19 i int 20 start int64 21 messages []int64 22 } 23 24 func makeTimestamp() int64 { 25 return time.Now().UnixNano() / int64(time.Millisecond) 26 } 27 28 type int64arr []int64 29 30 func (a int64arr) Len() int { return len(a) } 31 func (a int64arr) Swap(i, j int) { a[i], a[j] = a[j], a[i] } 32 func (a int64arr) Less(i, j int) bool { return a[i] < a[j] } 33 34 func (state *remoteActor) Receive(context actor.Context) { 35 switch msg := context.Message().(type) { 36 case *messages.Start: 37 context.Respond(&messages.Started{}) 38 case *messages.Ping: 39 now := makeTimestamp() 40 latency := now - msg.Time 41 if state.i == 0 { 42 log.Println("starting") 43 state.start = makeTimestamp() 44 } 45 46 state.messages[state.i] = latency 47 state.i++ 48 if state.i == 1000000 { 49 done := makeTimestamp() 50 delta := done - state.start 51 log.Printf("Test took %v ms", delta) 52 53 a := int64arr(state.messages) 54 sort.Sort(a) 55 56 data := make(map[string]int64) 57 for i := 0; i < 100; i++ { 58 key := fmt.Sprintf("%v", i) 59 data[key] = state.messages[i*10000] 60 } 61 62 data["99.9"] = state.messages[999000] 63 data["99.99"] = state.messages[999900] 64 65 log.Println("Done") 66 for k, v := range data { 67 log.Printf("%v %v", k, v) 68 } 69 } 70 } 71 } 72 73 func newRemoteActor() actor.Producer { 74 return func() actor.Actor { 75 return &remoteActor{ 76 i: 0, 77 messages: make([]int64, 1000000), 78 } 79 } 80 } 81 82 func main() { 83 runtime.GOMAXPROCS(runtime.NumCPU()) 84 runtime.GC() 85 86 remote.Start("127.0.0.1:8080", remote.WithEndpointWriterBatchSize(10000)) 87 rootContext := actor.EmptyRootContext 88 props := actor. 89 PropsFromProducer(newRemoteActor()). 90 WithMailbox(mailbox.Bounded(1000)) 91 92 rootContext.SpawnNamed(props, "remote") 93 94 console.ReadLine() 95 }