This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-05-04
Channels
- # admin-announcements (9)
- # beginners (40)
- # boot (61)
- # cider (6)
- # cljsrn (5)
- # clojure (65)
- # clojure-gamedev (6)
- # clojure-greece (8)
- # clojure-ireland (1)
- # clojure-portugal (5)
- # clojure-russia (46)
- # clojure-uk (38)
- # clojurescript (177)
- # core-async (9)
- # cursive (17)
- # datomic (6)
- # dirac (8)
- # emacs (5)
- # error-message-catalog (8)
- # hoplon (248)
- # ldnclj (11)
- # ldnproclodo (1)
- # lein-figwheel (36)
- # leiningen (12)
- # mount (2)
- # off-topic (3)
- # om (26)
- # onyx (12)
- # perun (2)
- # planck (26)
- # re-frame (62)
- # reagent (55)
- # remote-jobs (2)
- # rethinkdb (1)
- # ring-swagger (14)
- # spacemacs (47)
- # untangled (69)
тут давеча ngrok обсуждался. Я сейчас проверил, subdomain работает в бесплатной версии при наличии токена, как это было и в первом нгроке
вопрос в чем, если я делаю
(swap! state assoc :ready? false)
то цикл не останавливается. чяднт?@trybeee: это весь код, только while и swap! в comment обернут чтобы не выполнялся при старте репла
до repl'a swap не доходит. thread зацикливается внутри while
@bernik: код не очень хорош. императивный, и целый thread занимает. лучше словами опиши, что хотел сделать?
вот, взгляд несколько лучший подход
(go-loop [] (>! start-ch (read-web "http://ya.ru")) (<! (timeout 1000)) (when-not @stop-flag (recur)))
делаем вызов web и постим результат в канал start-ch
ждем секунду
если глобальный флаг нам не говорит выходить переходим на начало цикла
у данного примера несколько улучшений по сравнению с твоим кодом.
1) код go-loop выполняется в отдельном потоке
2) timeout не занимает thread
что наверно стоило бы улучшить это вызов I/O в (thread ...)
на самом деле можно и без глобального флага обойтись. нужно грамотно спроектировать каналы и тогда при закрытии головного канала, все остальные циклы прервутся и закроют свои ресурсы и каналы. произойдет каскадное освобождение ресурсов без необходимости внесения глобальной переменной stop-flag в каждый кусок кода
@mike1452: пример с go-loop я понимаю. только в чем будет разница между go-loop и while, завернутый в future? оба будут выполняться в отдельном потоке, условие выхода и цикла через состояние внешнего атома, внутри - сайд-эффекты.
на самом деле, в моем кейсе внешний флаг выхода нужен только для разработки, в прод режиме я могу себе позволить потушить приложение
я до конца механику не очень понимаю, но могу предположить следующее: future создает отдельный поток, в то время как для выполнения твоей логики целый поток может быть и не нужен. go макросы создают легковесные потоки из существующего пула потоков. из go легче передать результат в другие каналы и заблокироваться
future имеет другую семантику, но тоже полезный инструмент, но мне с каналами как-то проще стало
хотя я долго голову ломал как с ними организовывать код
@mike1452: у меня достаточно примитивное приложение, которое раз в определенный период постит статус в твиттер. мне нет необходимости заботиться о количестве потоков потому что их будет два: для цикла и приложения. каналы - интересный инструмент, но не для этой задачи.
bitbuket
@bernik: как я понимаю (возможно я не прав), разница между future и go блоком в том, что в го блоках есть места, где можно запарковать поток, например, при ожидании данных из другого канала. в future такой возможности нет - поток из пула либо выполняет что-то, либо блокируется на том же thread/sleep или ожидании IO. потенциально мы можем создать больше легковесных потоков (го блоков), чем futures.