Clojure, как остановить все блоки go или закрыть все каналы в core.async

все слишком часто, когда я использую core.async из блока repl, a go ускользает от меня, потому что я теряю канал, который используется для его остановки, потому что я перезагружаю пространство имен. Например, если я запускаю это из repl:

(go (when (not= c (second (async/alts! [c (async/timeout 1000)]))) 
      (println "hello")))

а затем я перезагружаю пространство имен, и c теряется. Теперь у меня "привет" спамит мой REPL до скончания века. Если бы я мог закрыть все каналы или убить все блоки перехода, это спасло бы меня от перезапуска моего REPL.


person Arthur Ulfeldt    schedule 13.02.2014    source источник


Ответы (1)


Я не знаю способа сделать это глобально. Один из методов заключается в использовании канала управления, который можно использовать для отключения любого контура. Материал pub/sub может хорошо работать для глобального элемента управления. канал.

person Alex Miller    schedule 13.02.2014