Программа завершается, потому что после создания этих go
блоков основная функция завершается. От нечего делать он выходит; это не должно быть большим сюрпризом. Конечно, мы бы предпочли, чтобы основное приложение продолжало работать, пока все эти go
блоки все еще живы.
Каждый из этих go
блоков создает канал; вы можете подождать, пока один из них что-то вернет (хотя в нынешнем виде они никогда этого не сделают). Попробуйте заблокировать с помощью alts!!
во время вращения:
(defn -main
[& args]
(let [c (chan)]
(alts!!
[(go (while true
(>! c (rand))))
(go (while true
(<! c)))])))
Таким образом, ваш основной поток будет блокироваться до тех пор, пока один из каналов в alts!!
не вернет значение. Прямо сейчас он заблокируется навсегда, но эта структура настраивает вас на более интересные вещи. Например, вы можете выйти из приложения, когда случайное значение превысит некоторый порог:
(defn -main
[& args]
(let [c (chan)]
(alts!!
[(go (while true
(>! c (rand))))
(go-loop [value (<! c)]
(if (> value 0.8)
value ; return value from the go block
(recur (<! c))))])))
Или, сходите с ума, тайм-аут через секунду:
(defn -main
[& args]
(let [c (chan)]
(alts!!
[(go (while true
(>! c (rand))))
(go (while true
(<! c)))
(timeout 1000)])))
Более важный вывод заключается в том, что есть большая вероятность, что вы захотите заблокировать свой основной поток, чтобы дождаться, пока эти асинхронные go
блоки закончат свою работу.
person
Beyamor
schedule
12.01.2014
core.async
отмена обычно передается от производителя к потребителю путем вызоваclose!
на стороне производителя, а затем отправкиnil
на стороне потребителя. Вот пример кода: refheap.com/21103 - person Leon Grapenthin   schedule 12.01.2014