Сообщения публикуются перед подпиской в ​​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]) до подписки и посмотрим что получится.

Другие вопросы по тегам