Fork me on GitHub
#clojure-russia
<
2016-05-04
>
serioga14:05:40

тут давеча ngrok обсуждался. Я сейчас проверил, subdomain работает в бесплатной версии при наличии токена, как это было и в первом нгроке

az15:05:34

На днях кто-то это искал

niwinz19:05:15

The article about architectural decisions that I have mentioned in the past hangout

bernik20:05:40

вопрос в чем, если я делаю

(swap! state assoc :ready? false) 
то цикл не останавливается. чяднт?

dima20:05:27

@bernik: у меня останавливается

dima20:05:02

но я во future обернул while

dima20:05:08

а как иначе?

bernik20:05:02

@trybeee: если завернуть в future, то работает. без future - нет

dima20:05:52

как без future выполнить swap? можно полностью код посмотреть?

bernik20:05:51

> как без future выполнить swap? все выполняю в репле.

bernik21:05:20

@trybeee: это весь код, только while и swap! в comment обернут чтобы не выполнялся при старте репла

mike_ananev21:05:34

до repl'a swap не доходит. thread зацикливается внутри while

dima21:05:41

так while блокирует. до вызова swap не доходит

bernik21:05:24

вот это я и упустил. спасибо @mike1452 @trybeee

mike_ananev21:05:06

@bernik: код не очень хорош. императивный, и целый thread занимает. лучше словами опиши, что хотел сделать?

mike_ananev21:05:37

вот, взгляд несколько лучший подход

mike_ananev21:05:45

(go-loop [] (>! start-ch (read-web "http://ya.ru")) (<! (timeout 1000)) (when-not @stop-flag (recur)))

mike_ananev21:05:30

делаем вызов web и постим результат в канал start-ch

mike_ananev21:05:36

ждем секунду

mike_ananev21:05:11

если глобальный флаг нам не говорит выходить переходим на начало цикла

mike_ananev21:05:56

у данного примера несколько улучшений по сравнению с твоим кодом.

mike_ananev21:05:21

1) код go-loop выполняется в отдельном потоке

mike_ananev21:05:32

2) timeout не занимает thread

mike_ananev21:05:02

что наверно стоило бы улучшить это вызов I/O в (thread ...)

mike_ananev21:05:06

на самом деле можно и без глобального флага обойтись. нужно грамотно спроектировать каналы и тогда при закрытии головного канала, все остальные циклы прервутся и закроют свои ресурсы и каналы. произойдет каскадное освобождение ресурсов без необходимости внесения глобальной переменной stop-flag в каждый кусок кода

bernik21:05:09

@mike1452: пример с go-loop я понимаю. только в чем будет разница между go-loop и while, завернутый в future? оба будут выполняться в отдельном потоке, условие выхода и цикла через состояние внешнего атома, внутри - сайд-эффекты.

bernik21:05:56

на самом деле, в моем кейсе внешний флаг выхода нужен только для разработки, в прод режиме я могу себе позволить потушить приложение

mike_ananev21:05:39

я до конца механику не очень понимаю, но могу предположить следующее: future создает отдельный поток, в то время как для выполнения твоей логики целый поток может быть и не нужен. go макросы создают легковесные потоки из существующего пула потоков. из go легче передать результат в другие каналы и заблокироваться

mike_ananev21:05:27

future имеет другую семантику, но тоже полезный инструмент, но мне с каналами как-то проще стало

mike_ananev21:05:59

хотя я долго голову ломал как с ними организовывать код

bernik21:05:46

@mike1452: у меня достаточно примитивное приложение, которое раз в определенный период постит статус в твиттер. мне нет необходимости заботиться о количестве потоков потому что их будет два: для цикла и приложения. каналы - интересный инструмент, но не для этой задачи.

rmuslimov21:05:02

future is footgun simple_smile, consider use core.async

bernik21:05:18

кстати, а расскажите где вы хостите свои pet projects?

abtv22:05:42

github для публичных, bitbucket для закрытых

bernik22:05:26

я имел в виду место куда вы их деплоите. heroku, do, aws etc

abtv22:05:13

@bernik: как я понимаю (возможно я не прав), разница между future и go блоком в том, что в го блоках есть места, где можно запарковать поток, например, при ожидании данных из другого канала. в future такой возможности нет - поток из пула либо выполняет что-то, либо блокируется на том же thread/sleep или ожидании IO. потенциально мы можем создать больше легковесных потоков (го блоков), чем futures.

abtv22:05:01

кстати, ты можешь создать и настоящий поток с core.async/thread, если тебе нужен именно отдельный поток, при этом он все равно вернет канал, когда завершится

abtv22:05:07

Digital Ocean @bernik

abtv22:05:31

на амазоне даже год можно самым маленьким инстансом пользоваться бесплатно

abtv22:05:54

только там пинг большой, т.к. дата центр в Америке

abtv22:05:04

не удобно даже в консоли)

bernik22:05:54

@abtv: в общем случае я понимаю разницу между легковесными потоками в core.async и future. я спрашивал в контексте вопроса, который задавал, но спасибо за развернутый ответ. 😌