Я хотел бы запустить код какКак предотвратить близко! -ную, прежде чем ставить-ки в онто-чан
(->> input
(partition-all 5)
(map a-side-effect)
dorun)
асинхронно разделив вход и выход (а-побочный эффект).
Затем я написал код для эксперимента ниже.
;; using boot-clj
(set-env! :dependencies '[[org.clojure/core.async "0.2.374"]])
(require '[clojure.core.async :as async :refer [<! <!! >! >!!]])
(let [input (range 18)
c (async/chan 1 (comp (partition-all 5)
(map prn)))]
(async/onto-chan c input false)
(async/close! c))
объяснение этого кода:
- Собственно элементы ввода и его количество не определено перед запуском и элементов на входе может быть принято некоторыми числами от 0 до 10.
async/onto-chan
используется для помещения Seq элементов (фрагмента ввода) в каналc
и будет вызываться много раз, поэтому третий аргументfalse
.prn
является заменой дляa-side-effect
.
Я ожидал, что приведенный выше код печатает
[0 1 2 3 4]
[5 6 7 8 9]
[10 11 12 13 14]
[15 16 17]
в РЕПЛ однако он не печатает никаких символов.
А потом я добавить время, чтобы ждать, как этот
(let [c (async/chan 1 (comp (partition-all 5)
(map prn)))]
(async/onto-chan c (range 18) false)
(Thread/sleep 1000) ;wait
(async/close! c))
Этот код дал мой ожидаемый результат выше.
И затем я проверяю core.async/onto-chan
.
И я думаю, что случилось:
- канал
c
былcore.async/close!
редактор в моем коде. - каждый пункт аргумента
core.async/onto-chan
был поставлен (core.async/>!
) напрасно вgo-loop
вonto-chan
, потому что каналc
был закрыт.
Есть ли способ положить предметы до close!
ing? написать синхронную версию onto-chan
не используя go-loop
?
Или моя идея не так? Идея
Вы объясните, что ваша цель? Почему вы создаете chan 'c', ассоциируете с ним преобразователь, но никогда не принимаете никаких значений? – glts
https://clojure.github.io/core.async/#clojure.core.async/onto-chan Функция on-chan возвращает канал, который вы можете подождать, а затем закрыть c. – megakorre
@gits - моя цель слишком сложна, чтобы объяснить здесь. Я только что написал консульскую версию моего производственного кода. Конечно, есть много способов, если только печатать числа. Так же, как вы сказали, chan 'c' не означает никаких значений, но потребляет значения с' prn' сам по себе. – ryo