Помогите с алгоритмом планирования задач - PullRequest
1 голос
/ 02 сентября 2010

Я работаю над приложением, в котором связаны тысячи задач с сотнями устройств, для каждой из которых требуется <5 мсек, чтобы начать выполнение, и в среднем требуется 100 мс. </p>

Условия таковы:

  1. Каждое устройство может обрабатывать только один задача за один раз, например, одна задача должна завершиться на назначенной ей устройство до обработки последующей задачи.
  2. Планировщик должен быть работоспособным. В настоящее время обработка данного устройства рабочая очередь занимает больше времени, чем сумма ее задач.

Вот базовое описание текущей реализации:

Каждое устройство содержит рабочую очередь, которая заполнена задачами, связанными с это устройство.

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

Есть предложения по улучшению? Я ясно сказал это? Если нет, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы уточнить.

Спасибо, что нашли время, чтобы просмотреть это. Привет.

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Как насчет чего-то вроде ExecutorCompletionService вместе с ThreadPoolExecutor .Это дает вам обратный вызов по завершении, который вы можете использовать для отправки последующих заданий, и управляемый пул потоков исполнителей, который вы можете настроить для повышения пропускной способности.

Я предлагаю вам запустить свой код через профилировщик, чтобы увидеть, какие потокив настоящее время блокируются (звучит так, как будто это будут темы вашего устройства).Я могу порекомендовать YourKit Java Profiler , однако это не бесплатно.

0 голосов
/ 02 сентября 2010

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

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

...