Я понимаю, что 'go blocks' (go
или go-loop
или, возможно, другие конструкции) возвращают канал. Однако я никогда не понимал цели этого канала. Я хотел бы знать, как его использовать. Возможно, я создаю дополнительные каналы, когда мне это не нужно.Почему core.async go блоки возвращают канал?
1
A
ответ
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.
Смежные вопросы
- 1. Почему «core.async/конвейер» возвращает канал?
- 2. Clojure core.async нить блоки
- 3. Clojure - core.async объединить однонаправленный канал
- 4. Clojure - Почему выполнение происходит при блокировке вставки в канал? (Core.async)
- 5. Clojure core.async, канал vs port
- 6. Clojure - используйте канал core.async с Yada/Aleph
- 7. Clojure как остановить все блоки go или закрыть все каналы в core.async
- 8. Перенаправление clojure * out * на канал core.async
- 9. заканчивания блоки не возвращают ничего
- 10. Как остановить блок go в ClojureScript/core.async?
- 11. Блоки выводов в go
- 12. Go канал не работает
- 13. Отправить канал через канал с помощью Go
- 14. Как определить, когда канал core.async закрыт со стороны автора?
- 15. Как выделить блоки go для потоков в core.asyc
- 16. Core.async <! канальный тупик
- 17. Блоки брандмауэра Сервер развития Go
- 18. буферизация канал Go и тупики
- 19. len (канал) в Go потокобезопасен?
- 20. в Go, что означает канал?
- 21. Параллельный канал передачи/приема go
- 22. Почему тот же канал Go не может быть запущен дважды?
- 23. Состояния преобразователи в core.async
- 24. Изящно выйти из Clojure core.async go loop on kill
- 25. Почему канал не работает?
- 26. Как очистить каналы core.async от clojure?
- 27. Стоимость записи данных в канал go lang?
- 28. go - ввод в клавиатуру или канал-файл
- 29. Go: канал необходим в этом случае?
- 30. Является не core.async вопреки принципам Clojure?
Так как это блокировка, нет такой вещи, как возвращаемое значение, например, для функции. Чтобы обойти это, блок go возвращает канал, в который он отправляет свое возвращаемое значение. –