|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
Ребят, вопрос возник такой. В многопоточке я не особо силен, но иногда задачки попадаются, которые надо решать. Вот сейчас такая проблемка. Окружение Java EE, при нажатии кнопки пользователем надо обработать параллельно N задач, но потоков можно задействовать не больше M штук, причем потоков может быть меньше, чем задач, тогда первый освободившийся поток берет следующую задачу и так далее. Если задачи кончились, то поток возвращается в пул сервера. Причем пользователь может во время всего этого еще раз нажать кнопку и добавить еще сколько-то задач в этот же пул задач. Тогда, если часть потоков уже вернулись в пул, мне надо их опять запустить на обработку (но в сумме все равно не должно быть больше M рабочих потоков). Собственно такая задача, так как я сижу на Java EE, я могу стартовать асинхронный метод через @Asynchronous. Помимо этого могу использовать пул потоков общий серверный (его можно заинжектить как ресурс) Нагрузка не большая, т.е. нормальное поличество задач типа 5 - 10 (не тысячи). Количество потоков - около пяти (не тысячи). Т.е. тут можно смело использовать блокирующие алгоритмы, с точки производительности можно не заморачиваться. Пока у меня простое решение такое: задачи все складывать в thread safe set какой-нибудь (можно взять из ConcurrentHashMap) Количество потоков контроллировать счетчиком AtomicInteger - стартую поток, увеличиваю. Поток завершается (если нет задач) - уменьшаю счетчик. При старте новой пачки задач - проверяю счетчик, не превысил ли он максимума. Если надо - дозапускаю потоки на обработку. Т.е. как-то так. Я в многопоточке не особо. Пару раз прочитал Concurrency in Practice, понимание есть, но практики мало. Посоветуйте, может я велосипед изобретаю? Я бы создал свой пул на M потоков и все дела, но мне для каждого пользователя надо будет создавать такой пул (потому что все пользователи вообще независимы от друг друга и каждый имеет свои потоки). Так как я на Java EE сижу, это не вариант (или?). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2021, 17:44 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
rabiter, Если у тебя на сервере настроен пул задач, то ничего считать и складывать никуда не надо. просто добавляешь новую задачу в пул и всё - он сам разберётся когда её запустить можно будет. Свой пул потоков работает аналогично - запускаешь с нужными настройками и просто добавляешь в него задачи по мере поступления. Для начала - https://habr.com/ru/post/326146 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2021, 17:55 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
Никаких своих коллекций и AtomicInteger'ов не надо. Очередь задач и управление потоками - это все за тебя делает пул, см. java.util.concurrent.Executors. Тебе нужно просто создать еще один пул с M потоками. В Spring @Asynchronous'y можно указать пул, я думаю в JEE то же самое должно быть. Эти потоки - обычно не те же что используются App Server'ом для обработки запросов. rabiterЯ бы создал свой пул на M потоков и все дела, но мне для каждого пользователя надо будет создавать такой пул (потому что все пользователи вообще независимы от друг друга и каждый имеет свои потоки).Пул потоков не должен быть у каждого пользователя свой. Он должен быть общий. Иначе ты никак не будешь контроллировать сколько потоков может создаться в системе и ее легко смогу положить. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2021, 17:55 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev ... Пул потоков не должен быть у каждого пользователя свой. Он должен быть общий. Иначе ты никак не будешь контроллировать сколько потоков может создаться в системе и ее легко смогу положить. Никогда пулы потоков не понимал. На мой взгляд, какое-то совершенно не гибкое решение. Ну и подозреваю, при пулах так же полно ситуаций, когда "ее легко смогут положить". rabiterПока у меня простое решение такое: задачи все складывать в thread safe set какой-нибудь (можно взять из ConcurrentHashMap) Количество потоков контроллировать счетчиком AtomicInteger - стартую поток, увеличиваю. Поток завершается (если нет задач) - уменьшаю счетчик. При старте новой пачки задач 1. На мой взгляд, переусложнение. Тогда уж брать обычные блокированные thread safe коллекции или самому обернуть методы в synchronized. Прикручивать поверх Concurrent кучу AtomicInteger - тот еще г...но код получиться. 2. Кроме стандартных коллекций, можно найти ряд кастомных (например JCTools). То, что Вам нужно, называется bounded коллекции (с ограничением размеров). Будет и concurrent (точнее lock less или wait free) и самопальные (и скорее всего не корректные) Atomic'и прикручивать не нужно. Но если нагрузка не сильно большая (не миллионы обменов в секунду), то см. п.1 IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2021, 18:37 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Stanislav Bashkyrtsev ... Пул потоков не должен быть у каждого пользователя свой. Он должен быть общий. Иначе ты никак не будешь контроллировать сколько потоков может создаться в системе и ее легко смогу положить. Никогда пулы потоков не понимал. На мой взгляд, какое-то совершенно не гибкое решение. Ну и подозреваю, при пулах так же полно ситуаций, когда "ее легко смогут положить". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2021, 19:39 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
друзья! всем спасибо за ответы! по поводу общего пула и из него дергать потоки - ну да, это понятно. Я просто хотел еще квоты выдать на каждого пользователя, чтобы он мог из него дернуть, допустим, не больше пяти потоков в рамках своей сессии. Чтобы не получилось так, что один пользователь запустил 100 задач и все остальные сосут лапу. Хотя... когда сервер выдает потоки на обработку запросов (там отдельный пул), он же не смотрит по http сессиям, типа на эту сессию уже выделили 5 потоков, больше ей не давать - он просто выдает потоки и все, и как-то работает. Короче я склоняюсь к тому, что нужен один пул на всех пользователей, нафиг эти квоты. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2021, 20:14 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Пул потоков не должен быть у каждого пользователя свой. Он должен быть общий. Иначе ты никак не будешь контроллировать сколько потоков может создаться в системе и ее легко смогу положить. так я и не хочу вообще потоки сам создавать, я хотел просто брать из пула сервера потоки, но не больше чем N для каждого пользователя ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2021, 20:16 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev В Spring @Asynchronous'y можно указать пул, я думаю в JEE то же самое должно быть. Эти потоки - обычно не те же что используются App Server'ом для обработки запросов. ах, спринг 😸... В JEE такого нельзя, там вообще мало что можно, плюс еще и исходники проблематично посмотреть, потому что для каждого app server они свои) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2021, 20:20 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Stanislav Bashkyrtsev ... Пул потоков не должен быть у каждого пользователя свой. Он должен быть общий. Иначе ты никак не будешь контроллировать сколько потоков может создаться в системе и ее легко смогу положить. Никогда пулы потоков не понимал. На мой взгляд, какое-то совершенно не гибкое решение. Ну и подозреваю, при пулах так же полно ситуаций, когда "ее легко смогут положить". если очередь не забыли ограничить в голову приходит только хитрый кейс если ошибки не отлавливают то поток умирает и пересоздается для каждой новой таски. Количество потоков в пуле не ограничено. Задачи передеваемые в pool не заканчиваются никогда. Дедлоки от зависимых тасок. Но это специфические кейсы. Подскажите еще, будет интересно узнать. Leonid Kudryavtsev rabiterПока у меня простое решение такое: задачи все складывать в thread safe set какой-нибудь (можно взять из ConcurrentHashMap) Количество потоков контроллировать счетчиком AtomicInteger - стартую поток, увеличиваю. Поток завершается (если нет задач) - уменьшаю счетчик. При старте новой пачки задач 1. На мой взгляд, переусложнение. Тогда уж брать обычные блокированные thread safe коллекции или самому обернуть методы в synchronized. Прикручивать поверх Concurrent кучу AtomicInteger - тот еще г...но код получиться. мне наоброт показалось что самое простое решение (за исключением найти готовое), сделать обертку вокруг executor от контейнера со счетчиками per user с expired time. (Хотя выглядет не очень красиво, счетчики еще освобождать нужно как то, да еще и непонятно как) С bounded collection не очень то понятно зачем они нужны. Они вроде как нужны ссылки на таски хранить, но как то не особо по задаче ссылки хранить нужно, об этом executor контейнера сам позаботиться. А вот счетчики нужны. На базе JCTools что ипользоваться чтбы подменить дефолтовый BlockingQueue в ThreadPoolExecutor, непонятно как поскольку контейнер. А если как есть использоваться то кто будет консумером, как executor сделать консумером непонятно еще одну таску запустить чтобы она перекладывала в executor Сам с похожей задачей поскольку постольку сталкивался, но ограчились только одной таской пер user (экспорт генерация файла на лету) и там тупо у пользователя прописывали переменную и все. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2021, 21:28 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
rabiter, 5 юзверей? Ты пошутил? Чем тогда контейнер аппсервера не подошел? Его потоки? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 09:39 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Пул потоков не должен быть у каждого пользователя свой. Не слышал о логической схеме и физической в субд? автордобавить еще сколько-то задач в этот же пул задач. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 09:43 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
rabiter http сессиям Разве запросы по http не исполняются ПАРАЛЛЕЛЬНО? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 09:54 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
PetroNotC Sharp rabiter, 5 юзверей? Ты пошутил? Чем тогда контейнер аппсервера не подошел? Его потоки? Я не говорю, что я не собираюсь использовать потоки аппсервера. Как раз их-то я и собираюсь использовать. Но я хотел бы еще ввести квоты, чтобы каждому пользователю на обработку его нужд выдавать из этого пула не больше N потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 12:55 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
rabiter, Тут два момента 1) выше ты написал нафиг эти квоты 2) юз кейс напиши юзверя. Зачем ЕМУ эти самые квоты. Мне кажется это придумка придумщика программиста. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 13:11 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
rabiter Как раз их-то я и собираюсь использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 13:13 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
rabiter, найди спеку Java EE той версии, с которой работать надо. В спеке есть глава, должна быть, в которой описаны ограничения. Ну и следуй им. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 13:15 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
PetroNotC Sharp rabiter, Тут два момента 1) выше ты написал нафиг эти квоты 2) юз кейс напиши юзверя. Зачем ЕМУ эти самые квоты. Мне кажется это придумка придумщика программиста. Типичный кейс. юзер накликал от злости 100 долгоиграющих тасок. Да через UI можно ограничить но если те кто автоматизировал свою рутину и уних уже апсы написаны которые качают сразу все так что лимиты нужны (на всякий). Поменялось поведение польз0вателся предполагалось что больше одной таски ему не понадобится в связи с новым законодотельством теперь ему нужно 10 тасок запускать(да бакенд здесь не причем но 100 пользователей могут забить канал, cpu) так что плохеет всем. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 13:16 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
lleming, квоты - это больше о том чтоб деньги пользователи платили за их выделение. А если вопрос стоит только в том чтоб злой пользователь не заблокировал других - так это больше про task scheduling. Т.е. пул все равно один, просто он задачи должен брать в нужном порядке. Это лишь значит что не обычную FIFO коллекцию надо использовать, а какую-то кучу к примеру (PriorityQueue). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 13:28 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev lleming, квоты - это больше о том чтоб деньги пользователи платили за их выделение. А если вопрос стоит только в том чтоб злой пользователь не заблокировал других - так это больше про task scheduling. Т.е. пул все равно один, просто он задачи должен брать в нужном порядке. Это лишь значит что не обычную FIFO коллекцию надо использовать, а какую-то кучу к примеру (PriorityQueue). Про деньги топикстартер ничего не сказал. Больше выглядет, что ему хочется что таску большую можно разбить и запустить паралельно при этом не абузя других пользователей. Ну он назвал это квотами (оно и выглядет как квоты). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 13:36 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
lleming PetroNotC Sharp rabiter, Тут два момента 1) выше ты написал нафиг эти квоты 2) юз кейс напиши юзверя. Зачем ЕМУ эти самые квоты. Мне кажется это придумка придумщика программиста. Типичный кейс. юзер накликал от злости 100 долгоиграющих тасок. Да через UI можно ограничить но если те кто автоматизировал свою рутину и уних уже апсы написаны которые качают сразу все так что лимиты нужны (на всякий). Поменялось поведение польз0вателся предполагалось что больше одной таски ему не понадобится в связи с новым законодотельством теперь ему нужно 10 тасок запускать(да бакенд здесь не причем но 100 пользователей могут забить канал, cpu) так что плохеет всем. Во, спасибо! вы меня прекрасно поняли, именно в этом суть. Ну "квоты" слово может не самое удачное, как заметил Stanislav Bashkyrtsev Stanislav Bashkyrtsev lleming, квоты - это больше о том чтоб деньги пользователи платили за их выделение. А если вопрос стоит только в том чтоб злой пользователь не заблокировал других - так это больше про task scheduling. Т.е. пул все равно один, просто он задачи должен брать в нужном порядке. Это лишь значит что не обычную FIFO коллекцию надо использовать, а какую-то кучу к примеру (PriorityQueue). Вы предлагаете расшарить очередь задач между пользователями, наградить ее логикой, чтобы она имплементировала справедливость и приоритезировала задачи. Тут уйма вариантов выстрелить себе в ногу. Луше уж пусть у каждого пользователя будет своя очередь задач (пользователи разграничены через @SessionScoped бины). Но ваша идея отличная, я вообще на вооружение принял. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 13:52 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
ra-001 rabiter, найди спеку Java EE той версии, с которой работать надо. В спеке есть глава, должна быть, в которой описаны ограничения. Ну и следуй им. Да я ее вдоль и поперек уже всю изучил за 10 лет в этом проекте)) Тут особо нечего изучать, пул есть, потоки берем оттуда, вот и все. Просто я не хочу, чтобы один пользователь взяь больше, чем положено. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 13:55 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
ну более менее я понимаю так. есть настраиваемый threadpool делаем его cachedthreadpool (цифры для примера) допустим 30 max size. делаем квоту в 3 потока на пользователя. Т.е паралельно с тои или иной степерью гарантии 10 пользователей получат свою квоту. Остальные попадут в очередь или делаем ограничение и отбиваем лишние запросы на задачи пока не освободится место для пользователя. Проще всего в реализации не очень в утилизации ресурсов. Т.е. если пользователь всего один в данным момент, то идеально сразу на все свободные потоки закинуть задачи(ну может чуть меньше чтобы запас был всегда). Но тут уже состояние нужно пула отслеживать. Тут уже сложнее реализация. С приорити мне непонятно, каким образом у задачи определить приоритет? Вот пришла таск от пользователя он разбил ее на 5 подчазад и отправил в pool, от второго пришла. Как приоритет определить по какому параметру. Короче тут очень сложно сделать чтобы и утилизация была хорошей и при этом гарантии были. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 13:57 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
rabiter, Конкретнее! Что качают и на что лимиты! Ограничение это последнее дело программиста. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 14:00 |
|
Вопрос по многопоточке
|
|||
---|---|---|---|
#18+
ЕСЛИ НЕ ОГРАНИЧИВАТЬ, то что ломается аффтар? Больше взял чем положено что?)))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2021, 14:02 |
|
|
start [/forum/topic.php?fid=59&msg=40117029&tid=2120295]: |
0ms |
get settings: |
17ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
477ms |
get tp. blocked users: |
2ms |
others: | 383ms |
total: | 958ms |
0 / 0 |