2012-05-15 2 views
-1

Я хочу понять, как работают рабочие потоки Netty. в соответствии с кодом, для каждого нового запроса мы получаем nextwoker() любой из рабочего потока и выделяем его для обработки событий клиента. SO один поток сможет обрабатывать различные запросы от разных клиентов в соответствии с моим пониманием.Netty - Как работают рабочие потоки

У меня есть один вопрос здесь, будь то для клиента (канал/сокет) все события, происходящие в этом конкретном канале, обрабатываются одним и тем же потоком или могут обрабатывать различные потоки. Мое предположение - единственный поток обрабатывает все события (исключая события Будущего). Но согласно документации MemoryAwareThreadPoolExecutor они сообщают, что для канала разные потоки обрабатывают разные события.

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

+0

Может быть, вы должны смотреть на эту тему здесь: http://stackoverflow.com/questions/6796717/jboss-netty-how-to-serve-2-connections-using-3-worker- threads – UVM

+0

Я понимаю, что netty с пулом потоков обрабатывает 10000 сообщений, мой вопрос здесь другой. Я увидел исходный код и увидел, что они делают круговую анимацию для выделения потока для каждого запроса клиента. поэтому 100 рабочих потоков и 10000 соединений. один поток обслуживает 100 соединений с помощью java NIO. Я хорошо понимаю эту часть. Будут ли все события в одном соединении обрабатывать мои те же потоки или потоки diffenrent, которые являются моим вопросом. – codeninja

ответ

0

С моей точки зрения Netty использует рабочие потоки для обработки входящих соединений.

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

Что вы должны сделать, это отправить свою работу в другой пул потоков, используя OrderedMemoryAwareThreadPoolExecutore; или вы можете сделать это, используя свой собственный Исполнитель в messageReceived().

2

Тот же рабочий поток будет использоваться для канала все время. Так что это безопасно.

Если вы используете OrderedMemoryAwareThreadPoolExecutor, это может быть не так.

0

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