Я только недавно узнал о языке программирования Google Go. Меня заинтриговала предлагаемая им поддержка параллелизма, и я решил узнать о ней больше. Тем не менее, я пошел посмотреть, как Go реализует определенную функцию параллелизма, и до сих пор я не видел никаких доказательств того, что эта функция вообще существует.
Вот гипотетическая ситуация: предположим, мы программируем функцию для определения значения Foo определенного ввода. Для любого заданного ввода значение Foo находится либо в домене A, либо в домене B (но не в обоих). Методы поиска в этих доменах весьма различны, но у них есть общее свойство: успешные поиски, как правило, возвращаются быстро, в то время как неудачные поиски должны пройти через весь набор данных, чтобы быть исчерпывающими, и поэтому они занимают много времени.
Теперь на других языках, использующих параллелизм (таких как Cilk), можно запрограммировать функцию Foosearch так что он породил функцию Asearch и функцию Bsearch. Эти функции будут выполняться одновременно, и всякий раз, когда одна из них даст ответ, этот ответ будет передан вызывающей функции Foosearch, которая завершит все порожденные ею функции, которые не возвратились.
Однако с горутинами Go похоже, что вы можете соединить только две подпрограммы с каналом, поэтому вы не можете настроить канал, на который Asearch или Bsearch могли бы отправлять, в зависимости от того, кто нашел ответ первым, и чтобы Foosearch читал из Это. Также похоже, что вы не можете читать с канала, не блокируя его, поэтому вы не можете запустить Foosearch Asearch и Bsearch и настроить каналы из обоих, а затем запустить в цикле проверку, чтобы увидеть, произвел ли один или другой Ответ.
Правильно ли я понимаю ограничения параллелизма Go? Есть ли другой способ достичь данного результата?