Пул потоков со многими заблокированными задачами - PullRequest
3 голосов
/ 16 марта 2012

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

Я знаю, что в целом это не очень хорошая практика для использования пулов потоков, но текущая конструкцияне разрешает делать мои задачи асинхронными, чтобы они могли возвращать управление, не дожидаясь ответа сервера.Поэтому, учитывая это ограничение, я полагаю, что моей самой большой проблемой является увеличение потребления памяти для пространства стека потоков.

Так есть ли способ использовать какие-то легкие потоки, которые не занимают много памяти?

Теперь у меня есть опция JVM -Xss для управления памятью стеков, но, похоже, нет способа управлять этим для пула потоков или для потока только в отличие от его изменения для всех потоков внутри виртуальной машины, верно?

Также у вас есть предложения по лучшему решению моей проблемы?

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

В общем, я знаю, что это не очень хорошая практика для использования пулов потоков

Я не согласен. Я думаю, что это идеальная практика. Вы видите проблемы с этим подходом, потому что в противном случае переключение со стандартных потоков приводит к преждевременной оптимизации для меня?

Так есть ли способ использовать какие-то легкие потоки, которые не занимают много памяти?

Я думаю, что вы уже там. Потоки уже относительно легки, и я не вижу причин беспокоиться о сотнях из них, если вы не работаете в очень ограниченной JVM.

Также у вас есть предложения по лучшему решению моей проблемы?

Любое решение, которое я вижу, будет на лот более сложным и снова будет определением преждевременной оптимизации. Например, вы могли бы использовать NIO и самостоятельно планировать поток, когда ответ сервера был доступен, но это то, что вы получаете бесплатно с потоками.

1 голос
/ 16 марта 2012

Так есть ли способ использовать какие-то легкие потоки, которые не занимают много памяти?

Использование простых потоков в пуле потоков, вероятно, будет достаточно легким.

Теперь у меня есть опция JVM -Xss для управления памятью стеков, но кажется, что естьнет способа контролировать это для каждого пула потоков или только для потока, а не изменять его для всех потоков внутри виртуальной машины, верно?

Это максимальный размер для потока.Это размер, при котором вы хотите получить StackOverFlowError, а не продолжать работать.ИМХО, настройка этого параметра для каждого потока дает мало преимуществ.

Стек потока использует основную память для фактически используемой части, а остальную виртуальную память.Виртуальная память стоит дешево, если у вас есть 64-битная JVM.Если это проблема, я бы перешел на 64-разрядную.

Также есть ли у вас какие-либо предложения для лучшего решения моей проблемы?

Если у вас есть тысячипотоки вы могли бы рассмотреть возможность использования неблокирующего ввода-вывода.Не похоже, что тебе нужно беспокоиться.В проведенных мною тестах, когда 10000 активных потоков потребляют один процессор (если потоки ничего не делают) для каждых ста потоков вы можете тратить 1% одного процессора.Это вряд ли будет проблемой, если у вас есть запасной процессор.

...