Я хочу создать таймер с обратным вызовом, который можно прервать или сбросить с помощью SimPy. Если прервано, я не хочу, чтобы обратный вызов выполнялся, и если он сбрасывается, я хочу, чтобы таймер перезапускался с той же задержкой от env.now
. Сначала это казалось простой задачей, просто используя env.timeout
. Тем не менее, примечания к документации:Как прервать или отменить событие тайм-аута SimPy?
Чтобы на самом деле позволить времени проходить в симуляции, есть событие таймаута. Тайм-аут имеет два параметра: задержка и необязательное значение: Timeout (delay, value = None). Он запускает себя во время его создания и расписал себя в настоящее время + задержка. Таким образом, методы success() и fail() не могут быть вызваны снова, и вам нужно передать значение события, когда вы создаете таймаут.
Поскольку моделирование начинается срабатывает, я не могу добавить обратные вызовы и потому, что вы не можете назвать fail
, я не могу прервать тайм-аут.
Я рассмотрел только процесс, который ждет один тайм-код и проверяет флаг, если он был прерван или достиг env.now
, которого он ожидал, но это кажется ужасно неэффективным, и если у меня много таймеров (что я будет), я беспокоюсь, что количество генераторов будет подавлять симуляцию. (Функция тайм-аута, похоже, работает, планируя себя в будущем симуляции, поэтому у вас может быть тонна тех, кто работает).
Таким образом, спецификация - создание события, которое вызывает обратный вызов через определенное время, но может быть сброшено или прервано до этого времени. Есть предположения?
Великий ответ! Я протестировал и «начал»/'stop', пока вы« уступаете »' timer.action'. Однако это не похоже на то, что работает 'reset' - среда почему-то не получает сообщение. – bbengfort