Как построить монитор с бесконечным циклом? - PullRequest
0 голосов
/ 18 октября 2018

Я строю монитор в Котлине для планирования определенных операций. Мне нужна программа, которая вставляет или обновляет некоторые записи в базе данных в течение заданного промежутка времени.То, что я получил до сих пор, - это программа, которая выполняется в течение определенного промежутка времени, но в моей программе есть бесконечный цикл, который потребляет до 30% мощности процессора, когда не время для обновления.Итак, мой вопрос, как построить монитор без бесконечного цикла?

это мой код:

    while(!operations.done && appConfigurations.run_with_monitor) {
    if (DataSourceMonitor.isReadyForUpdate(lastMonitorModel)) {
        operations.update()
    }
}

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

interface IScheduler {
var done: Boolean
fun update()
fun reset()

}

Пример реализации:

class Repeat(private val task: IScheduler) : IScheduler {
override var done = false

override fun update() {
    if (this.task.done) {
        this.reset()
    }
    this.task.update()
    //logger.info { "Update repeat, done is always $done" }
}

override fun reset() {
    this.task.reset()
    this.done = false
}
}

class Sequence(private val task1: IScheduler, private val task2: IScheduler): IScheduler {
override var done = false
var current = task1
var next = task2

override fun update() {
    if (!this.done) {
        this.current.update()
        if (this.current.done) {
            this.current = this.next
        }
        if (this.next.done) {
            this.done = true
        }
    }
}

class Print(private val msg: String): IScheduler {
override var done = false

override fun update() {
    println(this.msg)
    this.done = true
}

override fun reset() {
    this.done = false
}

}

Значение операции может быть какследует:

val operations = Repeat(Sequence(Print("First action"), Print("Another action")))

** Итак, сейчас мой монитор работает и полностью функционирует, но как я могу улучшить производительность бесконечного цикла?**

Надеюсь, у кого-нибудь есть идеи по этому поводу.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Я реорганизовал свой код и смог добиться того же результата с меньшим количеством кода, удалив интерфейс IScheduler с помощью абстрактного класса TimerTask.Работа может быть выполнена с помощью следующих строк кода:

    val scheduler = Sequence(
        Print("Executed task 1"),
        Sequence(Print("Executed task 2"),
                Sequence(Print("Executed task 3"), Print("Finished Scheduler")))
)


Timer().schedule(scheduler, DELAY, PERIOD)

Все реализации интерфейса заменены на реализации TimerTask:

class Print(private val msg: String): TimerTask() {
override fun run() {
    println(msg)
 }
}

class Sequence(private val task1: Runnable, private val task2: Runnable): TimerTask() {
override fun run() {
    task1.run()
    task2.run()
 }
}
0 голосов
/ 18 октября 2018

Если ваш DataSourceMonitor не имеет возможности заблокировать, пока isReadyForUpdate не вернет true, тогда обычным подходом является добавление задержки.Например:

while(!operations.done && appConfigurations.run_with_monitor) {
    if (DataSourceMonitor.isReadyForUpdate(lastMonitorModel)) {
        operations.update()
    } else {
        Thread.sleep(POLL_DELAY);
    }
}

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

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

...