Wie kann ich explizit leer ist, wird ein Kanal?
Die kurze version:
Gibt es eine Möglichkeit, ein leerer Kanal gehen ohne neu zu erstellen, oder Durchlaufen Sie?
Dem warum:
Ich bin mit zwei Kanälen senden und empfangen von Daten, und ich habe einen zusätzlichen Kanal, um zu signalisieren, dass eine Verbindung notwendig ist.
Nun, wenn der transport wurde zurückgesetzt/wiederhergestellt ich will 'leere' des zusätzlichen Kanal, um sicherzustellen, dass es keine veralteten andere Anfragen zum zurücksetzen das würde die Sache wieder.
- mögliche Duplikate von in regelmäßigen Abständen flushing channel in golang
- Können Sie genauere Angaben über Ihren Fall? Speziell darüber, was Sie wieder mit und warum. Ohne all die details, es klingt für mich wie das wahre Problem, das gelöst werden muss ist, indem junk-Daten in Ihrem Kanal, nicht entfernen es nach-der-Tatsache.
- Die 2 Kanäle zum senden und empfangen von Daten über ein socket, wo die Daten analysiert, die in einem anderen Teil des Codes übernimmt das Protokoll. Falls das Protokoll Fehler findet möchte ich in der Lage sein, um ein signal-transport-Schicht, die eine Verbindung erforderlich ist. Das ist, warum brauchte ich den zusätzlichen Kanal
- broto: ich dachte, es wäre schön, wenn ein Datenfluss zu gehen, wo jeder Schritt ist ein bisschen höher als der nächste. Am geringsten ist der transport, dann der nächste in der Kette ist das eigentliche Protokoll, und einen Schritt weiter sein könnte, dass etwas wirkt auf das Protokoll. Auf diese Weise können Sie die swap-Teile, ohne die anderen bits zu wissen (wie z.B. entfernen der transport-und-versenden von bekannten byte-Sequenzen zum testen)
- Ihre Mitarbeiter werden es Ihnen danken für die Trennung unabhängigen Logik. Socket IO gehört nicht mit Protokoll-spezifische message-parsing.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie beschreiben, ist von Natur aus schwungvoll, da gibt es unter Umständen legitime Anfragen um sich erneut auf den Kanal. Anstatt zu versuchen, um die drain-Kanal, würde ich empfehlen, halten track von timing.
Auf Ihre reconnect-Kanal, post die mal. Wenn Sie fertig mit dem verbinden, beachten Sie die Zeit. Während dem Verzehr der reconnect-Kanal, wegwerfen alle Nachrichten, die älter sind, als Ihre Letzte Verbindung wiederherstellen.
Anderen lockstep-Lösung dies zu erreichen, ist die reconnect-Kanal ein bool. Post "true" zu verbinden. Wenn das verbinden abgeschlossen ist, post "false". Dann verbrauchen Sie den Kanal, bis Sie "false".
Ist es nicht möglich, ein leerer Kanal, ohne eine Schleife. Wenn Sie nicht über alle gleichzeitigen Empfängern, dann können Sie mit dieser einfachen Schleife:
Wenn Sie tun gleichzeitigen Empfängern, verwenden Sie dann die Schleife:
Ein weiterer Ansatz ist die Nutzung von
sync.Cond
undatomic
, etwas entlang der Linien von:Spielplatz
Es klingt wie, anstatt ein reset Kanal, den Sie möchten, eine reset-goroutine. Es würde noch einen Eingang von der Seite senden des reset-Signals und einen Ausgang zum Empfänger. Wenn diese goroutine eine Anforderung empfängt, die Verbindung wiederherzustellen, es gibt Sie an den Empfänger. Dann wartet er, um zu erhalten eine Bestätigung zurück von dem Empfänger auf einem Dritten Kanal, wegwerfen wiederverbindungs-Anfragen, die es erhält, in der Zwischenzeit. Also 3 Kanäle insgesamt, 1 Eingang, 1 Ausgang, 1 ack.