Когда я использую ZMQ для получения сообщений через TCP на Mac, через несколько часов я получил программу, использующую 100% ЦП. Используя lsof, я обнаружил, что kqueue перешел в проводное состояние
myprogram 56486 user 13u KQUEUE count=4, state=0x8
, и грограмма продолжает что-то ждать.
Может кто-нибудь сказать мне, что означает состояние 8 в очереди?
коды детали:
язык: Golang
пакет: github.com/pebbe/zmq4
poller := zmq.NewPoller()
// sub is the zmq socket over TCP that receives message
poller.Add(sub, zmq.POLLIN)
for {
polled, _ := poller.Poll(zeroMQTimeout)
if len(polled) >= 1 && polled[0].Events&zmq.POLLIN != 0 {
msg, _ := sub.RecvMessageBytes(0)
go handleMsg(msg[1])
} else {
fmt.Printf("something happened at %s\n", time.Now())
}
}
путем входа в систему, я вижу, что основнойgoroutine висит где-то в цикле for, и он, вероятно, будет на sub.RecvMessageBytes
.
Использование блокирующего приема вместо устройства опроса не улучшает ситуацию.