Clojure async - порядок элементов в канале - PullRequest
0 голосов
/ 18 сентября 2018

Мне трудно понять вывод следующего примера кода.

(def ch (a/chan 1))

(a/go-loop []
  (Thread/sleep 1000)
  (a/onto-chan ch [1 2 3 4 5] false)
  (recur))

(a/go-loop []
  (Thread/sleep 500)
  (let [val (a/<! ch)]
    (println val))
  (recur))

Я ожидал увидеть задержку в 500 мс между каждым числом, которое печатается в REPL, получая числа 1-5 для того, чтобы другой диапазон начал печатать.

Тем не менее, создается впечатление, что числа чередуются при вводе Thread / sleep в блок go, который читает из канала.У меня сложилось впечатление, что элементы извлекаются из канала в том же порядке, в котором они помещены в канал?

Чего-то мне не хватает?

1 Ответ

0 голосов
/ 18 сентября 2018

onto-chan выполняется асинхронно.Каждое выполнение вашего первого go-loop в основном запускает новый процесс, помещая значения в канал параллельно.Обратите внимание на документацию, в которой говорится Returns a channel which will close after the items are copied.

Если вы дождетесь завершения onto-chan, вы получите ожидаемый результат:

(def ch (async/chan 1))

(async/go-loop []
  (Thread/sleep 1000)
  (async/<! (async/onto-chan ch [1 2 3 4 5] false))
  (recur))

(async/go-loop []
  (Thread/sleep 500)
  (when-let [val (async/<! ch)]
    (println val)
    (recur)))
...