Python — планирование с функцией остановки и возобновления выполнения задач

Я разрабатывал приложение для планирования, в расписании есть много ламп, которые включаются и выключаются в определенное время, скажем, если я начну расписание утром, все лампы включатся, а затем остановятся ночью, но есть некоторые лампы, которые нужно остановить в определенное время. случайное время, а также включить снова. Я пробовал какой-то пакет Python, такой как APScheduler, но у него нет функции остановки и возобновления определенной задачи (или лампы в этом случае).

Этот вопрос с использованием рассола для остановки и возобновления , но я не знаю, как это реализовать, есть ли способ решить это?

Заранее спасибо, извините за мою плохую грамматику.

--ОБНОВЛЕНИЕ--

Вот простая реализация, я не уверен, что этот код правильный.

from datetime import datetime
from time import sleep

class Scheduling:

    def __init__(self):
        self.lamp = {}

    def run(self, lamp_id, start, finish):
        """Called one-time only for each lamp"""

        self.lamp[lamp_id] = (start, finish)

        while True:
            if datetime.now().strftime('%H:%M:%S') == start:
                sleep(1)
                print 'SET LAMP %s ON' % lamp_id
            elif datetime.now().strftime('%H:%M:%S') == finish:
                sleep(1)
                print 'SET LAMP %s OFF' % lamp_id

    def stop(self, lamp_id):
        print 'SET lamp %s OFF' % lamp_id

    def resume(self, lamp_id):
        print 'SET lamp %s ON' % lamp_id 
        finish = self.lamp[lamp_id][1]

        while True:
            if datetime.now().strftime('%H:%M:%S') == finish:
                print 'SET lamp %s OFF' % lamp_id 

if __name__ == '__main__':
    schedule = Scheduling()
    schedule.run(1, '00:00:00', '00:01:00')

person Kyomuu    schedule 19.12.2012    source источник


Ответы (2)


Я думаю, что вы, возможно, смотрите на эту проблему неправильно. Рассматривать «включение лампы» как задачу, которую нужно остановить и возобновить, слишком сложно. На самом деле у вас есть серия запланированных событий без сохранения состояния; включить лампу, выключить лампу (и, возможно, переключить лампу, которая включает ее, если она выключена, или выключает, если она включена). Если вы попытаетесь смоделировать систему таким образом, вам, вероятно, будет проще настроить планировщик.

person Silas Ray    schedule 19.12.2012
comment
Я думаю правильно, я написал простую реализацию, но я думаю, что это не хорошо, когда этот скрипт, работающий на моем процессоре, получил почти 60% использования только для одной лампы. - person Kyomuu; 19.12.2012
comment
Вы, вероятно, захотите использовать внешний механизм хранения (DB, csv, yaml и т. д.) для записи всех запланированных событий, чтобы ваш процесс сохранял запись последнего времени его запуска в другом файле, а затем обрабатывал все события, запланированные между последними событиями. время выполнения и текущее время из файла конфигурации. Затем вы можете просто запланировать ОС для запуска процесса каждые 15 минут или каждый час или что-то в этом роде. - person Silas Ray; 19.12.2012

Использование APScheduler — неплохое решение, и именно его я бы использовал в данном случае. Я бы написал клиентский триггер.

Этот триггер будет использовать клиентскую базу данных или хранилище данных, которое легко расширить из хранилища памяти или хранилища базы данных по умолчанию. У этого есть флаг, пропускать или не запускать конкретное задание. Итак, что произойдет сейчас, так это то, что когда появится задача на включение/выключение лампы, триггер клиента проверит базу данных, чтобы увидеть, включена ли задача, и выполнит требуемое действие на основе ее текущего состояния.

Это можно сделать, просмотрев документацию по расширению APScheduler.

класс триггера интервала, который будет расширен для включения вашей остановки /возобновление логики

Интерфейс, который вам потребуется реализовать для хранилища данных клиента.

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

В вашей реализации есть одна проблема, заключающаяся в том, что циклы while переходят в бесконечный цикл без приостановки в середине, потому что вы не обрабатываете случай else для части внутреннего цикла и не засыпаете. Это вызывает высокую загрузку ЦП с помощью одной лампы.

person sean    schedule 19.12.2012