Синхронизация потоков Java для операций ввода-вывода и операций с высокой нагрузкой на процессор - PullRequest
1 голос
/ 17 декабря 2010

Задача состоит в том, чтобы обрабатывать несколько потоков ввода-вывода (загрузки по протоколу HTTP) с использованием некоторой загрузки процессора В идеале хотелось бы иметь полную пропускную способность и использовать процессор на 100%. Конечно, тяжелая загрузка процессора медленнее, чем загрузка через Интернет. Необработанные данные могут быть кэшированы на диск. Существуют ли какие-либо исполнители в ASF или других компонентах, обеспечивающих эту функциональность? Если нет - каков наилучший способ добиться этого? Думая о наличии двух пулов потоков, один для Internet-To-Disk и другой для Disk-To-CPU-To-Disk операций.

РЕДАКТИРОВАНИЕ:

Я уточню свой вопрос:

2 пула потоков: Internet-To-Disk и Disk-To-CPU-To-Disk - это подход производителя / потребителя. Вопрос был в том, КАК убедиться, что я выбрал правильное количество потоков для producers и consumers? Один и тот же код будет работать одновременно на разных блоках, дугах с разным количеством ядер и разной пропускной способностью. Как убедиться, что я выбрал правильное количество потоков, чтобы использовать 100% пропускную способность и 100% ЦП?

Ответы [ 4 ]

1 голос
/ 19 декабря 2010

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

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

Вы также можете установить число потоков для обработки ЦП немного большим, чем количество ядер, если потоки обработки ЦП не всегда используют 100% ЦП от начала до конца. Например, если они могут выполнить некоторые операции ввода-вывода или получить доступ к некоторому общему ресурсу во время обработки.

Но, как и в любой системе, идеальное количество потоков будет сильно зависеть от характера вашей программы. Вы можете использовать такие инструменты, как JVisual VM (в комплекте с JDK), чтобы проанализировать, как потоки используются в вашей программе, и попробовать различные варианты настройки потоков.

0 голосов
/ 17 декабря 2010

Если ваша стадия ЦП более интенсивна, чем время загрузки, почему бы просто не загрузить данные, поскольку вы можете их обработать.Таким образом, вы можете иметь несколько процессов Internet-to-CPU-to-Disk.Пропустив этап, это может быть быстрее, и, конечно, будет проще.

0 голосов
/ 17 декабря 2010

Я бы выбрал архитектуру производитель-потребитель: один пул потоков для обработки данных (управляемый ExecutorService) и один или несколько потоков для загрузки данных из Интернета.

Данные, подлежащие обработке, будут помещены в ограниченную очередь блокировки (например, LinkedBlockingQueue), так что загружающие потоки будут извлекать данные только при необходимости (то есть, когда вычислительный поток может обрабатывать новые данные). Кроме того, эта структура гарантирует безопасность потоков и публикацию памяти.

0 голосов
/ 17 декабря 2010

Вы можете использовать производитель-потребитель для этой цели. Используйте столько производителей и потребителей, сколько необходимо для удовлетворения потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...