Чтобы сделать асинхронную пут, используйте clojure.core.async/put!
(let [chs (repeatedly 10 chan)]
(doseq [c chs]
(put! c "hello"))
(doseq [c chs]
(println (<!! c))))
Это работает в данном примере, как <!!
всегда разблокируют из-за все необходимые путы происходит асинхронно. Обратите внимание на следующие вещи:
- Блокировка служит в качестве синхронизации ограничения между различными процессами
>!!
и <!!
блокировать основной-нить. go
выполняются в основном потоке, но их код модифицируется с помощью макрорасширения, поэтому управление исполнением инвертируется, и их можно припарковать/выполнять последовательно упорядоченными законами логики блокировки/буферизации каналов core.async
. Этот метод обычно упоминается как конечная машина IOC (инверсия управления).
- ClojureScript имеет только одну резьбу. Следовательно, его реализация
core.async
даже не содержит >!!
/<!!
. Если вы пишете код, предназначенный для совместимости с ClojureScript, используйте только каналы в пределах go
-программы или отправляйте значения из них в функции более высокого порядка, переданные в take!
, и всегда делаете их в go
-протонах или используйте put!
.
Является (go (>! ch v))
эквивалентно (put! ch v)
?
Да, но это не то же самое. put!
- это обертка API вокруг реализации каналов метода core.async.impl.protocols/WritePort
put!
. Макроэксплуатация (go (>! ch v))
заканчивается тем же вызовом метода, но обертывает его в большом количестве генерируемого кода состояния машины, чтобы, возможно, припарковать операцию ввода и приостанавливать выполнение команды go
до тех пор, пока потребитель не будет готов принять от ch
(попробуйте (macroexpand `(go (>! ch v)))
самостоятельно). Нерестить блок блокировки только для одной асинхронной операции ввода - это отходы и хуже работает, чем звонить put!
сразу. go
порождает и возвращает дополнительный канал, из которого вы можете извлечь свои тела. Это позволит вам дождаться завершения его выполнения, которое вы не намеревались сделать в своем примере (с целью асинхронной операции).
Is '(put! C)' эквивалентно '(go (>! C))'? –
Я отредактировал свой ответ, надеюсь, предоставит больше информации. –
Отлично, спасибо! –