Eric,
I don't know what I can add beyond what has already been written in this
thread. I haven't following Netty development so I don't know if this is
still the case or not. At the time, a channel was bound to a thread in an
EventExecutorGroup, so you could run into a situation where a group of
channels that were all bound to the same thread would be under serviced if
one of those tasks took a lot of CPU time. If instead you delegate to a
standard ExecutorService, each task for a given channel might run on a
separate thread so a single task couldn't starve all of the channels.
Kind regards,
Sean
On Friday, February 9, 2018 at 8:40:00 PM UTC-5, Eric Fulton wrote:
>
> Hey sorry I know this is a very old thread, but can you explain why in you
> example you think it would be better to use your own ExecutorService over
> someEventExecutorGroup? What would be the difference?
>
>
>
>
> On Wednesday, October 9, 2013 at 7:27:06 AM UTC-7, Sean Bright wrote:
>>
>> Thanks Norman.
>>
>> So based on this, it seems that if I have a "typical" pipeline:
>>
>> ctx.pipeline().addLast("decoder", new MyProtocolDecoder());
>> ctx.pipeline().addLast("encoder", new MyProtocolEncoder());
>> ctx.pipeline().addLast(someEventExecutorGroup, "handler", new
>> MyProtocolHandler());
>>
>> Using an EventExecutorGroup doesn't actually buy me anything. I/O won't
>> be blocked, but handler execution will.
>>
>> I understand the point of doing all of this - if you know your methods
>> will always be called on the same thread it reduces the synchronization
>> complexities in the handlers - but in this model when you are dealing with
>> hundreds of connections, any handler method that causes a delay in
>> processing will block (num_connections / num_event_executor_threads) - 1
>> other handlers.
>>
>> So it would appear that in order to get the behavior that I want (any one
>> connection should not affect another), I would eliminate the
>> EventExecutorGroup and would need to submit tasks to an ExecutorService
>> that I manage myself, correct?
>>
>> I guess I just don't see how an EventExecutorGroup is beneficial.
>>
>> In any case, I love Netty. Keep up the good work!
>>
>>
>> On Tuesday, October 8, 2013 11:40:30 AM UTC-4, Sean Bright wrote:
>>>
>>> Greetings,
>>>
>>> I just want to validate my understanding of Netty 4's thread model
>>> compared to Netty 3's (specifically as it applies to NIO).
>>>
>>> With Netty 3, you would specify a boss thread pool and a worker thread
>>> pool (all/most of the examples use Executors.newCachedThreadPool() with the
>>> default args). ChannelHandler events would be called on the I/O threads
>>> from the worker group. Any delay in the handler methods would cause a
>>> delay in processing I/O for other connections. In order to compensate for
>>> this, you could add an ExecutionHandler to the pipeline which would cause
>>> the handler methods to be fired on an executor thread and therefore
>>> wouldn't affect I/O.
>>>
>>> In Netty 4, you specify a boss group and worker group, and as channels
>>> connect they are registered to specific threads. So channel 1 will always
>>> have it's handler events fired on thread A, channel 2 will always have it's
>>> handler events fired on thread B. Again, any delayed processing that
>>> occurs in the handler method will hurt I/O for other channels registered to
>>> that worker thread. To compensate, you specify an EventExecutorGroup so
>>> that I/O is not affected with long running tasks.
>>>
>>> Assuming everything above is correct...
>>>
>>> Assume that I create a DefaultEventExecutorGroup, passing 4 as the
>>> number of threads, and assign that to my handler in the pipeline. Now, 8
>>> channels connect:
>>>
>>> Channel A: EventExecutor 1
>>> Channel B: EventExecutor 2
>>> Channel C: EventExecutor 3
>>> Channel D: EventExecutor 4
>>> Channel E: EventExecutor 1
>>> Channel F: EventExecutor 2
>>> Channel G: EventExecutor 3
>>> Channel H: EventExecutor 4
>>>
>>> Each channel is registered to EventExecutor thread. If Channel A in the
>>> above example performs a long running task (say, in channelRead0), then
>>> won't Channel E be blocked during this time? Is that correct or am I not
>>> understanding something? If I am correct, why would I ever want to use an
>>> EventExecutor? I feel like I would be better off using a shared Executor
>>> directly from my handler methods (and handling thread synchronization
>>> myself). At least in that case I wouldn't be blocking other clients.
>>>
>>> Thank you,
>>> Sean
>>>
>>>
--
You received this message because you are subscribed to the Google Groups
"Netty discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/netty/9e16ca7a-7452-4f7b-bd04-b0dd04458b36%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.