At work, we do something conceptually very similar, and there I noticed a big impact that a heavy handler has on performance. Writing the side of the code / write handler works too much and takes too long the workflow, thereby compromising the program flow. Especially RST packets (closed connections) were not detected fast enough by the read handler because the write actions took their sweet time and forced most of the processing time into the workflow. I currently fixed this by creating two worker threads, so that one line of code was not hungry from processing time. Admittedly, this is far from ideal, and it is on my long list of optimizations.
In short, you can get rid of using one thread for reading and writing if your handlers are lightweight and the second thread is processing the rest of your program. As soon as you notice strange synchronization problems, it's time to either lighten the network handlers or add an additional thread to the work pool.
source share