в каком направлении двигаться чтобы Concurrency подучить, я как понимаю это пакет concurrency в джаве посмотреть надо, а в спринге уже реактивщина как раз на основе этого пакета работает?
не только пакет конкарренси, еще потокобезопасные коллекции типа ConcurrentHashMap а вообще атомики, синхронайед, локи, латчи, барьеры, фазеры, ключевое слово volatile вот это надо спринг не обязательно реактивный в дефолт спринг вебе просто на каждый реквест делается по потоку а бины по дефолту синглтоны то есть, те же сервисы должны быть потокобезопасными
Concurrency in practice книжка такая есть
То что на реквест по потоку я понимаю, мне больше интересно как сделать чтобы задачи паралельно выполнялись, какие то вычисления, мне например нужно парсер написать где каждый час будут данные с сайтов собираться, при этом когда данные нужно собирать на этих сайтах очень большая нагрузка и они грузятся по несколько минут, поэтому хотел как-то с многопоточкой запросы отправлять и потом уже собирать данные
тут лучше не многопоток многопоток хорош в тяжелых по цпу задачах асинк в тяжелых по io ожидание бд или ответа из сети - это io тут либо анноташка Async, либо вообще спринг вебфлюкс нюанс в том, что хибернейт построен на ждбц а он блокирующий следовательно, если не хочешь в асинке лочить свой пул при запросе в бд, надо менять на r2dbc и опционально брать обертку, которая его умеет, типа jooq
А async допустим я сделаю метод в сервисе для парсинга, а потом если начну в цикле перебирать и вызывать этот метод, то эти задачи начнут паралельно работать? Так данные в html будут приходить мне ещё нужно будет потратить ресурсы чтобы распарсить его
в этом и разница в многопотоке при блокирующем вызове блокируется весь поток и стоит ждет, пока вызов завершится, просто расходуя ресурсы в асинке задача может освобождать поток, на котором выполняется, пока ждет ответа чтобы этот поток заняли другие задачи и он не простаивал поэтому параллельности тут можно добиться и многопотоком, и асинком но асинк будет эффективнее
когда я в Котлин в Корутине на Dispatchers.IO делаю запрос в бд с помощью jdbc, то у меня весь пул потоков Dispatchers.IO блокируется?
не весь, а только тот поток, на котором выполняется корутина, в которой идет вызов ждбц
Спасибо, нужно получше в этом разобраться) А можете пример задачи приближенной к реальным проектам подсказать которую нужно решить с многопоточкой
многие не хотят морочиться с асинком и, пока перфоманс устраивает, всю параллельность пилят на многопотоке прикол в том, что каждый поток расходует оперативку и условная 1000 потоков будет в разы больше жрать, чем 1000 асинк тасок на пуле из 10 потоков, например
А спринг реактившина строится же на том же принципе, там пул потоков пока задача там что-то ожидает, то поток освобождается?
но асинк таски надо перекидывать между потоками, и этот оверхед имеет смысл только если перекидывать реально надо типа если асинк таска делает неблокирующие вызовы в бд, сеть или диск, и ждет сидит то ее выкидывают с потока, пока она ответ не получит и на поток кидают другие, которым есть что делать поэтому потоки не простаивают если таска делает какие-то долгие вычисления и прочее, то есть не ждет никакого внешнего ответа, то ставить ее на паузу и выкидывать с потока нельзя и она его просто так занимает и работать такое будет ничуть не быстрее голой многопоточки, а то еще и медленнее крч асинк нужен, чтобы куча потоков не простаивала, когда чего-то ждет извне программы
Обсуждают сегодня