我目前正在学习 Go 和 ZeroMQ,本着这种精神,我正在尝试为Zguide贡献 Go 示例。我在中断示例上有点挣扎。我不确定处理问题的惯用方式是什么。
我目前拥有的解决方案如下:我创建一个接收 SIGINT 信号的通道。当它发生时,我在主循环中使用的另一个通道上写一个布尔值来中断。问题是,Recv 是阻塞的,循环永远不会检查循环条件。我通过将 NOBLOCK 常量传递给 Recv 来规避这个问题。但我觉得有一种更好的方法,因为 Recv 在中断时应该返回一个 EINTR(据我所知,它并没有)。你们读者比我更有能力回答这个问题,你怎么看?
为了您的方便,我到目前为止的代码:
package main
import (
"os/signal"
"os"
"fmt"
zmq "github.com/alecthomas/gozmq"
)
func listenForSignals(exit_channel chan bool) {
signal_channel := make(chan os.Signal)
signal.Notify(signal_channel)
<- signal_channel
fmt.Println("stopping")
exit_channel <- true
}
func main() {
exit := make(chan bool)
exit_signal := false
go listenForSignals(exit)
context, _ := zmq.NewContext()
defer context.Close()
socket, _ := context.NewSocket(zmq.REP)
defer socket.Close()
socket.Bind("tcp://*:5555")
for exit_signal == false {
select {
case exit_signal = <- exit:
fmt.Println("W: interrupt received, killing server...")
default:
msgbytes, err := socket.Recv(zmq.NOBLOCK)
fmt.Printf("%s.\n", string(msgbytes))
}
}
}
编辑根据反馈在一定程度上简化了代码