clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
kuzmin_m 2018-09-30T18:39:54.000100Z

Привет. Cтал разбираться с core.async. И у меня возник вопрос. В core.async есть макрос thread. Т.е. можно запустить код в собственном треде, чтобы не блокировать go блок. Но этот тред берется из тредпула, а он неограничен. https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async.clj#L427-L453 Допустим, мне придет миллион сообщений в канал, и каждое сообщение нужно записать в собственный файл. Естественно запись будет обернута в async/thread. И система попытается запустить миллион тредов? Да, при этому нужно явно задать размер очереди для канала, т.к. там ограничение на 1024 сообщения. TLDR; как работать с блокируемыми операциями в core.async?

serioga 2018-09-30T18:46:34.000100Z

@kuzmin_m посмотри async/pipeline-blocking

serioga 2018-09-30T18:49:00.000100Z

ну а входная пропускная способность регулируется размером буфера канала и типом сброса при переполнении (sliding-buffer, dropping-buffer)

kuzmin_m 2018-09-30T18:49:54.000100Z

спасибо, увидел, там parallelism задается

kuzmin_m 2018-09-30T18:51:03.000100Z

А если есть вебсервер, естественно, он не пишет все запросы в один канал и к нему pipeline не применим.

kuzmin_m 2018-09-30T18:52:33.000100Z

Кстати, Go в этой ситуации просто упадет. https://github.com/golang/go/commit/665feeedcbef8a1c968d6da5be052e9fd9678380