Прежде всего, убедитесь, что ваша гипотеза действительно правильная. Вы должны проверить:
- Сколько данных передается
- Сколько данных получено
- Сколько времени потребуется, чтобы отправить данные
- Сколько времени потребуется, чтобы работать на данных
HTTP работает через TCP, что обычно гарантирует доставку, поэтому даже если это займет много времени, ваш сервер должен получать всю входящую информацию.
Тем не менее, если вы все еще хотите, чтобы сделать процесс многопоточный, я бы рекомендовал следующую конструкцию:
- Один поток, как вы уже сейчас (СЛУШАТЕЛЬ НИТИ), который принимает входящие данные ,
- Другой набор потоков, которые будут обрабатывать поступающие данные (РАБОЧИЕ РЕЗЬБЫ).
- Поток слушателя будет принимать данные только и помещать их в очередь.
- Рабочие потоки деактивируют очередь и работают с данными.
Несколько заметок и вещи, чтобы думать, хотя:
- Позаботьтесь о синхронизации потоков - в частности, необходимо для защиты очереди.
- Думайте, если это имеет значение, какой рабочий поток получит данные. Если есть несколько фрагментов, которые необходимо позаботиться о конкретном рабочем потоке, вам необходимо решить эту проблему.
- В некоторых случаях, если на поток слушателя очень высока загрузка, очередь может стать узким местом, а точнее - блокировка в очереди может стать узким местом. В этом случае я бы рекомендовал переместиться в модель из N очередей для N рабочих потоков, и слушатель просто выбирает один по круговой схеме. Это минимизирует блокировки, и на самом деле, поскольку у вас будет один читатель и один писатель, вы можете даже уйти без блокировки (но это не подходит для этого ответа).
Еще один вариант - использовать пул потоков. Пул потоков - это пул потоков, которые спящий, пока они не понадобятся. Когда слушатель получает входящий ввод, он выделяет его на свободную нить или при необходимости увеличит пул; таким образом, у вас нет очереди, и ваши потоки оптимально используются.