Один из вариантов, который следует рассмотреть, - это иметь один поток, который запускает select / pole / epoll, но не обрабатывает результаты. Скорее он ставит в очередь соединения, о которых известно, что они имеют результаты, и позволяет пулу потоков получать данные. Если проверка того, что полный запрос считан, является дешевой, вы можете сделать это в потоке опроса с неблокирующим вводом-выводом и поставить в очередь только полные запросы.
Я не знаю, предоставляет ли D какую-либо поддержку для этого, кроме (возможно) межпотокового взаимодействия и организации очередей.