イベントキューといくつかのゴルーチンがあり、無限ループ内の対応するキューからイベントを取得し、処理し、結果をチャネルに送信します。異なるキューでは同じイベントが発生する可能性があります。そのため、各イベントが1回だけチャネルに送信されるようにする必要があります。また、別のキューのメッセージが無視されます。それは建築的な問題だと私は信じていますが、これを適切に処理する方法を理解することはできません。ゴルーチンとメッセージ重複除外
私の現在のコードの簡略版は以下の通りです。
取得し、着信イベントを処理ゴルーチンがやや次のようになります。
func (q *Queue) ProcessEvents(handler Handler) {
lastEvent = 0
for {
events = getEvents(lastEvent)
for _, e := range events {
if e.ID > lastEvent {
lastEvent = event.ID
}
handler.Handle(e)
}
}
}
ハンドラ:
type Handler struct {
c chan Event
}
func (h *Handler) Handle(event *Event) {
//event processing omitted
h.c <- event //Now it just sends a processed event into the channel no matter what.
}
そしてメインで()私は
func main() {
msgc := make(chan Event)
for _, q := range queues {
go func(queue Queue) {
queue.ProcessEvents(&Handler{msgc})
}
}
}
チャンネルの受信側でこれを行い、同じイベントを複数回処理したくないようです。 –
しかし、atmルーチンがお互いを知りませんので、イベントがすでに別のgoroutineによって処理されているかどうかを確認するにはどうすればよいですか?それが本当に主な質問です。 –
シングルスレッドの場合はどうしますか?これはゴルーチンに関するものではありません。重複排除を行う場合は、メッセージが重複しているかどうかを知る必要があります。つまり、あなたが今までに受け取ったすべてのメッセージを(潜在的に)保存し、新しいメッセージをすべて古いメッセージと比較して、以前に見たことがあるかどうかを確認することを意味します。 – Adrian