Selector.select (timeout) x Selector.selectNow () - PullRequest
1 голос
/ 14 июля 2010

Я внедряю неблокирующий HTTP-сервер в Java и решил использовать чистый Java NIO.Я объединяю селектор NIO с небольшим пулом потоков для выполнения операций, указанных селектором.

Оставляя систему, выбирайте селектор по умолчанию (протестировано в Linux 2.6 epoll и Mac OS SnowLeo KQueue ) и с помощью Selector.select(TIMEOUT); я получаю пул потоков в состоянии Monitor (в ожидании получения Monitor), в то время как основной поток (выполняющий цикл события селектора) всегда работает.В некоторых случаях состояние монитора (время ожидания получения монитора) тратится более 10 с.

Использование следующего подхода приводит к тому, что основной поток проводит большую часть своего времени в спящем режиме, меньше (почти ничего не отслеживает состояние монитора для объединенных потоков) и лучшая пропускная способность (1 тыс. запросов в секунду):

    while (true) {
        Thread.sleep(IOLoop.SELECT_TIMEOUT);
        if (selector.selectNow() == 0)
            continue;

        Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
             //...
             }

Любой, кто знает, где это влияние / риск этого решения, или как уменьшить / исключить затраченное время, пытаясь получить объект Monitor с помощью селекторавыбрать метод с таймаутом?

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 июля 2010

API селектора и солнечная энергия ужасны.

Этот документ позволяет блокировать несколько потоков в одном селекторе select (), но это бессмысленно.У вас должен быть заблокирован только один поток для одного selector.select ().

И фактический impl просто делает syncrhonized(this) в select () для достижения безопасности потока.

Это похоже на Vector и Hashtable старых дней чрезмерной синхронизации.

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

0 голосов
/ 14 июля 2010

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

В некоторых случаях состояние монитора тратит более 10 с.

Что вы подразумеваете под этим?

...