*Дано*: Мне надо моделировать поведение устройства...
# russian
l
Дано: Мне надо моделировать поведение устройства. Устройство может выполнять команды и реагировать на окружающую среду. При этом, настоящее устройство делает это с задержкой, что важно для бизнес-логики. То есть перед тем, как собственно выполнить команду или среагировать на среду - оно "взводит курок" и ждет какое то время. Если за этого время не произошло отмены и условия не поменялись - оно исполняет команду или реагирует на среду. Это очень хорошо решается на корутинах. Но есть одно но. Бывают задачи, когда надо быстро "промотать" все действия устройств. Без задержек, со сохранив очередность, как если бы задержки таки были. Вопрос1: Можно ли синхронизировать времена "просыпания" корутин? Или может просто заменить реализацию delay на что-то другое? Например на некий setOrder "просыпать" те корутины, у которых наименьший общий order? То есть насильно "заснуть" корутину и записать ее в некую Map где будет написано когда ее "проснуть" и потом "просыпать" ее так же насильно. Вопрос 2: Есть ли более удачный способ решения? Мое текущее решение - что есть корутина-устройство, с каналом на вход и каналом на выход. Если корутине надо что то отложенно выполнить - она отправляет сообщение себе же в канал но с задержкой. Внутри себя корутина содержит логику и состояние, как я понимаю таким образом сохраняется потокобезопасность и корутина делает что то одно в один момент времени. корутина с задержкой определяется "снаружи" корутины-устройства: это будет или реальный delay или алгоритм выбирающий наименьшую общую задержку. Иронично, что внутри корутины-устройства образуется самопальный механизм корутины %) Потому что там находится условие, что делать когда прилетит то или иное собщение-с-задержкой. По-моему это признак того, что я свеловипедил, но я не знаю как иначе управлять этим. Мне кажется, что если я воткну туда настоящее "засыпание" то я не смогу это же корутину запустить с другого места (чтобы обработать еще одно сообщение, пока работа над первым приостановлена), наверно отличие именно в этом. Вопрос 2.1: Вышеописанное так же можно решить с помощью нескольких корутин и одного состояния, то тогда они должны запускаться строго в одном потоке и не мешать друг другу. Так можно сделать? Вопрос 3: А так же, безопасно ли будет
Copy code
class Test {
        var a = 0
        suspend fun test() {
            a = 1
            delay(1000)
            if (a == 1) {
                ///
            }
        }
    }
При этом
a
могут и поменять. С состоянием корутин вообще не рекомендуется работать? Только через акторы?