Dieses Muster ist nützlich, um am Schnittpunkt von Modulen in Ihrem System zu verwenden. An diesen Kreuzungen haben Sie in der Regel mehrere Bedingungen für das Abbrechen von Bäumen von Goroutinen durch Ihre Aufrufliste. Mit der oder-Funktion können Sie diese einfach kombinieren und den Stapel weiterleiten. Wir werden einen Blick auf eine andere Möglichkeit werfen, dies in “The context Package” zu tun, die auch sehr schön und vielleicht ein bisschen beschreibender ist. Es stellt sich heraus, dass die Notwendigkeit, einen fertigen Kanal mit diesen Informationen zu wickeln, sehr häufig in Systemen jeder Größe ist, und so entschieden sich die Go-Autoren, ein Standardmuster dafür zu erstellen. Es begann als ein Experiment, das außerhalb der Standardbibliothek lebte, aber in Go 1.7 wurde das Kontextpaket in die Standardbibliothek eingebracht, was dies zu einem Standard-Go-Idiom machte, das bei der Arbeit mit gleichzeitigem Code zu berücksichtigen war. Es sollte beachtet werden, dass es im Falle eines Fehlers möglich ist, dass einige Pipeline-Goroutinen für einen kurzen Zeitraum weiterausgeführt werden können, nachdem runSimplePipeline an den Aufrufer zurückgegeben hat. Dies liegt daran, dass WaitForPipeline sofort zurückkehrt, wenn ein Fehler auftritt. Dies ist in der Regel kein Problem, aber Sie sollten die Auswirkungen dieses Verhaltens berücksichtigen, wenn Ihre Pipeline-Funktion Nebenwirkungen hat. Möglicherweise können Sie eine Synchronisierung verwenden. WaitGroup, um die Beendigung von Pipeline-Goroutinen zu gewährleisten, bevor runSimplePipeline zurückkehrt. Beachten Sie, wie wir dies tun konnten, ohne eine neue Funktion zu schreiben, eine der vorhandenen zu ändern oder zu ändern, was wir mit dem Ergebnis unserer Pipeline tun. Vielleicht beginnen Sie, die Vorteile der Verwendung des Pipelinemusters zu sehen.

Natürlich könnten wir diesen Code auch prozedural schreiben: Das Worker-Pool-Muster ist ein bekanntes Go-Muster für Worker-Pools und es gibt zahlreiche Beispiele, wie man SIGTERM-Benachrichtigungen anmutig herunterfährt, aber wir haben erkannt, dass einige unserer Anforderungen unseren Anwendungsfall etwas komplizierter gemacht haben. Der Go Blog hat einen ausgezeichneten Artikel über das Pipeline-Muster von Sameer Ajmani geschrieben. In diesem Artikel wird dieses Pipelinemuster in Golang um eine verbesserte Fehlerbehandlung und -unterdrückung erweitert. Wenn Sie diesen Artikel noch nicht gelesen haben, sollten Sie zumindest mit dem Abschnitt Was ist eine Pipeline vertraut sein? Mit diesem Muster ist es einfach, Weiterhin Kanäle als Verknüpfungspunkte Ihres Systems zu verwenden. Ein SOAP-Knoten, der die Anfangsnachricht eines Transportnachrichtenaustauschs empfängt, instanziiert einen Transportnachrichtenaustauschkontext ähnlich, um den Fortschritt des Nachrichtenaustauschs auf diesem Knoten darzustellen.

share this: Facebooktwittergoogle_plusredditpinterestlinkedintumblrmail