Ich habe erst vor kurzem die Programmiersprache Go von Google kennengelernt. Die angebotene Unterstützung für Gleichzeitigkeit hat mich fasziniert, und ich habe mich daran gemacht, mehr darüber zu erfahren. Ich wollte jedoch sehen, wie Go ein bestimmtes Merkmal der Gleichzeitigkeit implementiert, und bisher habe ich keinerlei Hinweise darauf gefunden, dass dieses Merkmal überhaupt vorhanden ist.
Hier ist eine hypothetische Situation: Nehmen wir an, wir programmieren eine Funktion, die den Foo-Wert einer bestimmten Eingabe bestimmt. Für jede beliebige Eingabe wird der Foo-Wert entweder im Bereich A oder im Bereich B gefunden (nicht in beiden). Die Techniken für die Suche in diesen Bereichen sind recht unterschiedlich, aber sie haben die Eigenschaft, dass erfolgreiche Suchvorgänge in der Regel schnell zu einem Ergebnis führen, während erfolglose Suchvorgänge den gesamten Datensatz durchlaufen müssen, um vollständig zu sein, und daher viel Zeit in Anspruch nehmen.
In anderen Sprachen, die Gleichzeitigkeit verwenden (z. B. Cilk ) könnte man die Funktion Foosearch so programmieren, dass sie eine Asearch-Funktion und eine Bsearch-Funktion auslöst. Diese Funktionen würden gleichzeitig laufen, und immer wenn entweder eine Antwort, so würde diese Antwort der aufrufenden Funktion Foosearch mitgeteilt, die alle von ihr ausgelösten Funktionen, die nicht zurückgekehrt sind, beenden würde.
Bei den Goroutinen von Go sieht es jedoch so aus, als könne man nur zwei Routinen mit einem Kanal verbinden - man könnte also nicht einen Kanal einrichten, an den entweder Asearch oder Bsearch senden könnte, je nachdem, wer zuerst eine Antwort gefunden hat, und Foosearch daraus lesen lassen. Es sieht auch so aus, als ob man nicht von einem Kanal lesen kann, ohne ihn zu blockieren - also könnte man Foosearch nicht Asearch und Bsearch starten und Kanäle von beiden einrichten und dann in einer Schleife laufen lassen, um zu sehen, ob der eine oder der andere eine Antwort produziert hat.
Ist mein Verständnis der Grenzen der Gleichzeitigkeit von Go richtig? Gibt es eine andere Möglichkeit, das angegebene Ergebnis zu erreichen?