powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по многопоточке
25 сообщений из 161, страница 1 из 7
Вопрос по многопоточке
    #40116776
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, вопрос возник такой. В многопоточке я не особо силен, но иногда задачки попадаются, которые надо решать. Вот сейчас такая проблемка.

Окружение Java EE, при нажатии кнопки пользователем надо обработать параллельно N задач, но потоков можно задействовать не больше M штук, причем потоков может быть меньше, чем задач, тогда первый освободившийся поток берет следующую задачу и так далее. Если задачи кончились, то поток возвращается в пул сервера. Причем пользователь может во время всего этого еще раз нажать кнопку и добавить еще сколько-то задач в этот же пул задач. Тогда, если часть потоков уже вернулись в пул, мне надо их опять запустить на обработку (но в сумме все равно не должно быть больше M рабочих потоков).
Собственно такая задача, так как я сижу на Java EE, я могу стартовать асинхронный метод через @Asynchronous. Помимо этого могу использовать пул потоков общий серверный (его можно заинжектить как ресурс)
Нагрузка не большая, т.е. нормальное поличество задач типа 5 - 10 (не тысячи). Количество потоков - около пяти (не тысячи). Т.е. тут можно смело использовать блокирующие алгоритмы, с точки производительности можно не заморачиваться.
Пока у меня простое решение такое: задачи все складывать в thread safe set какой-нибудь (можно взять из ConcurrentHashMap)
Количество потоков контроллировать счетчиком AtomicInteger - стартую поток, увеличиваю. Поток завершается (если нет задач) - уменьшаю счетчик. При старте новой пачки задач - проверяю счетчик, не превысил ли он максимума. Если надо - дозапускаю потоки на обработку. Т.е. как-то так. Я в многопоточке не особо. Пару раз прочитал Concurrency in Practice, понимание есть, но практики мало.
Посоветуйте, может я велосипед изобретаю? Я бы создал свой пул на M потоков и все дела, но мне для каждого пользователя надо будет создавать такой пул (потому что все пользователи вообще независимы от друг друга и каждый имеет свои потоки). Так как я на Java EE сижу, это не вариант (или?).
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116778
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter,

Если у тебя на сервере настроен пул задач, то ничего считать и складывать никуда не надо. просто добавляешь новую задачу в пул и всё - он сам разберётся когда её запустить можно будет.

Свой пул потоков работает аналогично - запускаешь с нужными настройками и просто добавляешь в него задачи по мере поступления.
Для начала - https://habr.com/ru/post/326146
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116779
Никаких своих коллекций и AtomicInteger'ов не надо. Очередь задач и управление потоками - это все за тебя делает пул, см. java.util.concurrent.Executors. Тебе нужно просто создать еще один пул с M потоками.

В Spring @Asynchronous'y можно указать пул, я думаю в JEE то же самое должно быть. Эти потоки - обычно не те же что используются App Server'ом для обработки запросов.
rabiterЯ бы создал свой пул на M потоков и все дела, но мне для каждого пользователя надо будет создавать такой пул (потому что все пользователи вообще независимы от друг друга и каждый имеет свои потоки).Пул потоков не должен быть у каждого пользователя свой. Он должен быть общий. Иначе ты никак не будешь контроллировать сколько потоков может создаться в системе и ее легко смогу положить.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116794
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116815
Leonid Kudryavtsev
Stanislav Bashkyrtsev

...
Пул потоков не должен быть у каждого пользователя свой. Он должен быть общий. Иначе ты никак не будешь контроллировать сколько потоков может создаться в системе и ее легко смогу положить.


Никогда пулы потоков не понимал. На мой взгляд, какое-то совершенно не гибкое решение. Ну и подозреваю, при пулах так же полно ситуаций, когда "ее легко смогут положить".
Ну я таких ситуаций не знаю. Пулы представляют собой ограничение по кол-ву потоков, все просто. Если хочется что-то усложнять и писать свои пулы, то надо четко понимать зачем.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116826
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
друзья! всем спасибо за ответы!

по поводу общего пула и из него дергать потоки - ну да, это понятно. Я просто хотел еще квоты выдать на каждого пользователя, чтобы он мог из него дернуть, допустим, не больше пяти потоков в рамках своей сессии. Чтобы не получилось так, что один пользователь запустил 100 задач и все остальные сосут лапу. Хотя... когда сервер выдает потоки на обработку запросов (там отдельный пул), он же не смотрит по http сессиям, типа на эту сессию уже выделили 5 потоков, больше ей не давать - он просто выдает потоки и все, и как-то работает. Короче я склоняюсь к тому, что нужен один пул на всех пользователей, нафиг эти квоты.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116828
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Пул потоков не должен быть у каждого пользователя свой. Он должен быть общий. Иначе ты никак не будешь контроллировать сколько потоков может создаться в системе и ее легко смогу положить.


так я и не хочу вообще потоки сам создавать, я хотел просто брать из пула сервера потоки, но не больше чем N для каждого пользователя
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116832
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
В Spring @Asynchronous'y можно указать пул, я думаю в JEE то же самое должно быть. Эти потоки - обычно не те же что используются App Server'ом для обработки запросов.


ах, спринг 😸... В JEE такого нельзя, там вообще мало что можно, плюс еще и исходники проблематично посмотреть, потому что для каждого app server они свои)
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116848
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 (экспорт генерация файла на лету) и там тупо у пользователя прописывали переменную и все.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116939
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter,
5 юзверей? Ты пошутил? Чем тогда контейнер аппсервера не подошел? Его потоки?
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116946
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Пул потоков не должен быть у каждого пользователя свой.
он по факту говорит о пуле задачек.
Не слышал о логической схеме и физической в субд?
автордобавить еще сколько-то задач в этот же пул задач.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40116950
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter
http сессиям
то есть у вас http и Application server.
Разве запросы по http не исполняются ПАРАЛЛЕЛЬНО?
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117007
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
rabiter,
5 юзверей? Ты пошутил? Чем тогда контейнер аппсервера не подошел? Его потоки?


Я не говорю, что я не собираюсь использовать потоки аппсервера. Как раз их-то я и собираюсь использовать. Но я хотел бы еще ввести квоты, чтобы каждому пользователю на обработку его нужд выдавать из этого пула не больше N потоков.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117008
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter,
Тут два момента
1) выше ты написал нафиг эти квоты
2) юз кейс напиши юзверя. Зачем ЕМУ эти самые квоты.
Мне кажется это придумка придумщика программиста.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117009
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter
Как раз их-то я и собираюсь использовать.
потоки контейнера автоматически стартует сам контейнер. Они из коробки.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117011
ra-001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rabiter,
найди спеку Java EE той версии, с которой работать надо.
В спеке есть глава, должна быть, в которой описаны ограничения. Ну и следуй им.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117012
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
rabiter,
Тут два момента
1) выше ты написал нафиг эти квоты
2) юз кейс напиши юзверя. Зачем ЕМУ эти самые квоты.
Мне кажется это придумка придумщика программиста.


Типичный кейс. юзер накликал от злости 100 долгоиграющих тасок. Да через UI можно ограничить но если те кто автоматизировал свою рутину и уних уже апсы написаны которые качают сразу все так что лимиты нужны (на всякий).

Поменялось поведение польз0вателся предполагалось что больше одной таски ему не понадобится в связи с новым законодотельством теперь ему нужно 10 тасок запускать(да бакенд здесь не причем но 100 пользователей могут забить канал, cpu) так что плохеет всем.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117017
lleming, квоты - это больше о том чтоб деньги пользователи платили за их выделение. А если вопрос стоит только в том чтоб злой пользователь не заблокировал других - так это больше про task scheduling. Т.е. пул все равно один, просто он задачи должен брать в нужном порядке. Это лишь значит что не обычную FIFO коллекцию надо использовать, а какую-то кучу к примеру (PriorityQueue).
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117021
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
lleming, квоты - это больше о том чтоб деньги пользователи платили за их выделение. А если вопрос стоит только в том чтоб злой пользователь не заблокировал других - так это больше про task scheduling. Т.е. пул все равно один, просто он задачи должен брать в нужном порядке. Это лишь значит что не обычную FIFO коллекцию надо использовать, а какую-то кучу к примеру (PriorityQueue).


Про деньги топикстартер ничего не сказал. Больше выглядет, что ему хочется что таску большую можно разбить и запустить паралельно при этом не абузя других пользователей. Ну он назвал это квотами (оно и выглядет как квоты).
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117026
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming
PetroNotC Sharp
rabiter,
Тут два момента
1) выше ты написал нафиг эти квоты
2) юз кейс напиши юзверя. Зачем ЕМУ эти самые квоты.
Мне кажется это придумка придумщика программиста.


Типичный кейс. юзер накликал от злости 100 долгоиграющих тасок. Да через UI можно ограничить но если те кто автоматизировал свою рутину и уних уже апсы написаны которые качают сразу все так что лимиты нужны (на всякий).

Поменялось поведение польз0вателся предполагалось что больше одной таски ему не понадобится в связи с новым законодотельством теперь ему нужно 10 тасок запускать(да бакенд здесь не причем но 100 пользователей могут забить канал, cpu) так что плохеет всем.


Во, спасибо! вы меня прекрасно поняли, именно в этом суть. Ну "квоты" слово может не самое удачное, как заметил Stanislav Bashkyrtsev

Stanislav Bashkyrtsev
lleming, квоты - это больше о том чтоб деньги пользователи платили за их выделение. А если вопрос стоит только в том чтоб злой пользователь не заблокировал других - так это больше про task scheduling. Т.е. пул все равно один, просто он задачи должен брать в нужном порядке. Это лишь значит что не обычную FIFO коллекцию надо использовать, а какую-то кучу к примеру (PriorityQueue).


Вы предлагаете расшарить очередь задач между пользователями, наградить ее логикой, чтобы она имплементировала справедливость и приоритезировала задачи. Тут уйма вариантов выстрелить себе в ногу. Луше уж пусть у каждого пользователя будет своя очередь задач (пользователи разграничены через @SessionScoped бины). Но ваша идея отличная, я вообще на вооружение принял.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117028
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ra-001
rabiter,
найди спеку Java EE той версии, с которой работать надо.
В спеке есть глава, должна быть, в которой описаны ограничения. Ну и следуй им.


Да я ее вдоль и поперек уже всю изучил за 10 лет в этом проекте)) Тут особо нечего изучать, пул есть, потоки берем оттуда, вот и все. Просто я не хочу, чтобы один пользователь взяь больше, чем положено.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117029
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну более менее я понимаю так. есть настраиваемый threadpool делаем его cachedthreadpool (цифры для примера) допустим 30 max size.
делаем квоту в 3 потока на пользователя. Т.е паралельно с тои или иной степерью гарантии 10 пользователей получат свою квоту. Остальные попадут в очередь или делаем ограничение и отбиваем лишние запросы на задачи пока не освободится место для пользователя.

Проще всего в реализации не очень в утилизации ресурсов. Т.е. если пользователь всего один в данным момент, то идеально сразу на все свободные потоки закинуть задачи(ну может чуть меньше чтобы запас был всегда). Но тут уже состояние нужно пула отслеживать.
Тут уже сложнее реализация.

С приорити мне непонятно, каким образом у задачи определить приоритет? Вот пришла таск от пользователя он разбил ее на 5 подчазад и отправил в pool, от второго пришла. Как приоритет определить по какому параметру. Короче тут очень сложно сделать чтобы и утилизация была хорошей и при этом гарантии были.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117031
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter,
Конкретнее! Что качают и на что лимиты!
Ограничение это последнее дело программиста.
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117032
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕСЛИ НЕ ОГРАНИЧИВАТЬ, то что ломается аффтар?
Больше взял чем положено что?))))))
...
Рейтинг: 0 / 0
Вопрос по многопоточке
    #40117033
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming
не очень в утилизации ресурсов.
монеторизации имхо.
Или прогер скупердяй.
...
Рейтинг: 0 / 0
25 сообщений из 161, страница 1 из 7
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по многопоточке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]