Сообщения публикуются перед подпиской в core.async
В следующем примере я вижу, что опубликованные сообщения поступают на подписанный канал, хотя они публикуются до подписки.
(let [in (async/chan)
out (async/chan)
pub (async/pub in :key)]
(async/go
(>! in {:id 1 :key :k1})
(>! in {:id 2 :key :k1})
(>! in {:id 3 :key :k1}))
(async/sub pub :k1 out)
(async/go-loop []
(println (<! out))
(recur)))
Это ожидаемое поведение? Насколько я вижу в документации, в ней четко сказано:
Предметы, полученные при отсутствии подходящих сабов, отбрасываются
Я получаю одинаковые результаты как в Clojure, так и в ClojureScript.
Добавлено: при мульт / тапе я вижу похожее поведение
1 ответ
Решение
Вы не знаете, что сообщения публикуются до подписки. Поскольку go является асинхронным, очень вероятно, что подписка произойдет до того, как первое сообщение будет помещено в канал. На самом деле это состояние гонки.
Попробуйте положить (Thread/sleep [some value])
до подписки и посмотрим что получится.