2016-03-26 3 views
1

Я понимаю, что 'go blocks' (go или go-loop или, возможно, другие конструкции) возвращают канал. Однако я никогда не понимал цели этого канала. Я хотел бы знать, как его использовать. Возможно, я создаю дополнительные каналы, когда мне это не нужно.Почему core.async go блоки возвращают канал?

ответ

2

Я использую обратный канал go -block как дескриптор, который я могу передать другой функции (а не только макрос), которая хочет синхронизировать с завершением go -блока. В качестве альтернативы, я могу выполнить префикс блокировки чтения на канале, чтобы гарантировать, что выполнение блока go завершено.

Вот простой пример (не предназначен для использования для любого производственного кода для вычисления суммы), что делает двухстороннее распараллеливание:

(defn par-sum [coll] 
    (let [half-n (/ (count coll) 2) 
     [left right] (split-at half-n coll) 
     left-sum-chan (async/go (core/reduce + 0 left)) 
     right-sum (core/reduce + 0 right) 
     left-sum (async/<!! left-sum-chan)] 
    (+ left-sum right-sum))) 

В этом примере мы вычислим левый и правые суммы в параллельны друг другу. Поскольку нам нужна левая сумма для вычисления общей суммы, нам нужно подождать результата и получить результат go -block.

+2

Так как это блокировка, нет такой вещи, как возвращаемое значение, например, для функции. Чтобы обойти это, блок go возвращает канал, в который он отправляет свое возвращаемое значение. –

Смежные вопросы