Привет.
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?
@kuzmin_m посмотри async/pipeline-blocking
ну а входная пропускная способность регулируется размером буфера канала и типом сброса при переполнении (sliding-buffer, dropping-buffer)
спасибо, увидел, там parallelism задается
А если есть вебсервер, естественно, он не пишет все запросы в один канал и к нему pipeline не применим.
Кстати, Go в этой ситуации просто упадет. https://github.com/golang/go/commit/665feeedcbef8a1c968d6da5be052e9fd9678380