В попытке получить хорошую практику параллельного программирования я пытаюсь реализовать шаблон «производитель / потребитель», используя библиотеку Clojure core.async.Все работает хорошо, но я хотел иметь возможность остановить как производителя, так и потребителя в какой-то момент времени.
Мой текущий код выглядит примерно так ...
(def c (a/chan 5))
(def alive (atom true))
(def producer (a/go-loop []
(Thread/sleep 1000)
(when @alive
(a/>! c 1)
(recur))))
(def consumer (a/go-loop []
(Thread/sleep 3000)
(when @alive
(println (a/<! c))
(recur))))
(do
(reset! alive false)
(a/<!! producer)
(a/<!! consumer))
К сожалению, этоПохоже, что блок 'do' иногда блокируется на неопределенный срок.По сути, я хочу иметь возможность остановить продолжение обоих циклов и блокировать их до тех пор, пока оба цикла не завершатся.Код Thread / sleep предназначен для имитации выполнения какой-либо единицы работы.
Я подозреваю, что остановка производителя заставляет потребителя парковаться, отсюда и зависание, хотя я не уверен в альтернативном подходе, любые идеи