| | |
| | | return &ret |
| | | } |
| | | |
| | | // RequestWithTimeout req sync |
| | | func (h *Handle) RequestWithTimeout(key int, info *MsgInfo, timeout int) *MsgInfo { |
| | | h.mtxWorker.Lock() |
| | | defer h.mtxWorker.Unlock() |
| | | |
| | | msg, err := proto.Marshal(info) |
| | | if err != nil { |
| | | return nil |
| | | } |
| | | |
| | | until := (float32)(timeout) |
| | | one := (float32)(timeoutSec) + ((float32)(timeoutUsec) / 1000000) |
| | | fc := until / one |
| | | |
| | | count := (int)(fc) |
| | | |
| | | try := 0 |
| | | |
| | | // 同步接口,需要等待返回值 |
| | | var ret MsgInfo |
| | | loop: |
| | | for { |
| | | select { |
| | | case <-h.ctx.Done(): |
| | | return nil |
| | | default: |
| | | if data, err := h.sockWorker.sock.SendAndRecvTimeout(msg, key, timeoutSec, timeoutUsec); err == nil { |
| | | if err := proto.Unmarshal(data, &ret); err == nil { |
| | | break loop |
| | | } else { |
| | | try++ |
| | | if try > count { |
| | | return nil |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return &ret |
| | | } |
| | | |
| | | // Reply request |
| | | func (h *Handle) Reply(key int, info *MsgInfo) error { |
| | | msg, err := proto.Marshal(info) |