私は現在 Go と ZeroMQ の両方を学んでおり、その精神でZguideの Go の例に貢献しようとしています。割り込みの例で少し苦労しています。問題を処理する慣用的な方法が何であるかはわかりません。
私が現在持っている解決策は次のとおりです。SIGINTシグナルを受信するチャネルを作成します。そうなったら、メインループでブレークするために使用される他のチャネルに bool を書き込みます。問題は、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))
}
}
}
編集は、フィードバックに基づいてコードをいくらか簡素化しました