Каналы core.async и блоки Go
Помимо ссылок и атомов, core.async добавляет в Clojure конкурентность в стиле CSP. На этом уроке вы изучите каналы, блоки go и координацию асинхронной работы взаимодействующих процессов.
«Каналы core.async и блоки Go» — бесплатный урок Clojure Functional Programming & JVM Backend Development на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Clojure Functional Programming & JVM Backend Development, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Clojure Functional Programming & JVM Backend Development содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Why core.async
Atoms and refs manage shared state. core.async manages communication between independent processes using channels, inspired by CSP.
Requiring the Library
Pull in the core functions you will use.
(require '[clojure.core.async :as a
:refer [chan go >! <! <!! >!!]])Creating a Channel
A channel is a queue that processes use to hand off values. Create one with chan.
(def c (chan))
; an unbuffered channelGo Blocks
A go block runs its body asynchronously on a thread pool, parking instead of blocking at channel operations.
(go (println "running asynchronously"))Putting and Taking
Inside a go block, >! puts a value and <! takes one. Both park until the other side is ready.
(let [c (chan)]
(go (>! c 42))
(go (println "got" (<! c))))Blocking Variants
Outside go blocks, use the double-bang forms >!! and <!!, which block the real thread. Useful at the REPL or in main.
(let [c (chan)]
(go (>! c "hello"))
(println (<!! c)))Buffered Channels
Give a channel a buffer so puts do not park until the buffer is full. This decouples fast producers from slower consumers.
(def c (chan 10))
; up to 10 values can sit in the bufferSelecting With alts!
alts! waits on several channels at once and proceeds with whichever is ready first, enabling timeouts and racing.
(go
(let [[v ch] (a/alts! [c (a/timeout 1000)])]
(println "got" v "from" ch)))Closing Channels
Closing a channel signals no more values. Takes then return nil, which consumers use as a stop signal.
(a/close! c)
; subsequent <! returns nilPipelines of Processes
Wire go blocks together with channels to form a pipeline: each stage takes from one channel, transforms, and puts onto the next. State stays local to each process.
Channels vs Atoms
Use atoms/refs for shared mutable state; use channels to coordinate the flow of work between processes. They solve different problems and often combine.
Quick Check
Test your core.async knowledge.
Recap
You learned channels, go blocks, parking puts/takes, blocking variants, buffers, alts! for selection and timeouts, closing channels, and how channels complement atoms and refs.
Часто задаваемые вопросы
Урок «Каналы core.async и блоки Go» бесплатный?
Да — полный текст урока «Каналы core.async и блоки Go» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Clojure Functional Programming & JVM Backend Development, подпишись на CoddyKit PRO. Курс Clojure Functional Programming & JVM Backend Development содержит 4 уроков всего.
Чему я научусь в уроке «Каналы core.async и блоки Go»?
Помимо ссылок и атомов, core.async добавляет в Clojure конкурентность в стиле CSP. На этом уроке вы изучите каналы, блоки go и координацию асинхронной работы взаимодействующих процессов. Ты практикуешь Clojure Functional Programming & JVM Backend Development с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Clojure Functional Programming & JVM Backend Development?
Предыдущий опыт не требуется. Clojure Functional Programming & JVM Backend Development на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Каналы core.async и блоки Go»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Clojure Functional Programming & JVM Backend Development?
Да. Каждый урок Clojure Functional Programming & JVM Backend Development включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Refs, Agents и Atoms для управления состоянием
- Транзакционная память программного обеспечения (STM)
- Обещания, фьючерсы и асинхронные операции
- Каналы core.async и блоки Go