Fork me on GitHub
#clojure-russia
<
2018-09-30
>
kuzmin_m18:09:54

Привет. 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?

serioga18:09:34

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

serioga18:09:00

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

kuzmin_m18:09:54

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

kuzmin_m18:09:03

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

kuzmin_m18:09:33

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