This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2018-09-30
Channels
- # 100-days-of-code (2)
- # announcements (2)
- # beginners (8)
- # boot (6)
- # calva (52)
- # cider (6)
- # cljs-dev (11)
- # cljsrn (3)
- # clojure (58)
- # clojure-austin (2)
- # clojure-russia (6)
- # clojure-spec (23)
- # clojure-uk (12)
- # clojurescript (29)
- # datomic (10)
- # emacs (1)
- # figwheel (2)
- # figwheel-main (2)
- # fulcro (3)
- # luminus (1)
- # off-topic (38)
- # re-frame (21)
- # ring-swagger (1)
- # robots (1)
- # shadow-cljs (65)
- # spacemacs (3)
- # tools-deps (16)
Привет.
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?
ну а входная пропускная способность регулируется размером буфера канала и типом сброса при переполнении (sliding-buffer, dropping-buffer)
А если есть вебсервер, естественно, он не пишет все запросы в один канал и к нему pipeline не применим.
Кстати, Go в этой ситуации просто упадет. https://github.com/golang/go/commit/665feeedcbef8a1c968d6da5be052e9fd9678380