@Statium

Как заменить time.sleep(N)?

Имеется служба с бесконечным циклом, не могу понять чем заменить time.sleep чтобы служба по запросу останавливалась сразу без ожидания этих секунд. Асинхронный код не получилось написать, пробовал через threading.Thread, тоже не получается.
class HelloWorldSvc(win32serviceutil.ServiceFramework):
    _svc_name_ = "Monitoring"
    _svc_display_name_ = "HMonitoring"

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.stop_event = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)
        self.stop_requested = False

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.stop_event)
        self.stop_requested = True

    def SvcDoRun(self):
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            servicemanager.PYS_SERVICE_STARTED,
            (self._svc_name_, '')
        )
        self.main()

    def main(self):
        # Simulate a main loop
        time.sleep(5)
        for i in iter(int, 1):
            # Подключение к MySQL
            logging.info("Подключаемся к БД MySQL")
            mydb = mysql.connector.connect(host/pass)
            mycursor = mydb.cursor()
            logging.info("Подключение выполнено успешно")

            time.sleep(3)
            if self.stop_requested:
                logging.info('Получен запрос на остановку службы. Служба остановлена')
                break

            # Получаем IP-адрес сервера
            logging.info("Запрашиваем IP-адрес сервера")
            try:
                ip = requests.get('http://localhost/')  # get-запрос
                logging.info("IP-адрес получен")
                time.sleep(3)
                ip = ip.text
            except:
                ip = "Error"
                logging.info("Не могу получить IP-адрес")

            if self.stop_requested:
                logging.info('Получен запрос на остановку службы. Служба остановлена')
                break
        return


if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(HelloWorldSvc)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(HelloWorldSvc)
  • Вопрос задан
  • 316 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Создай threading.Event и используй метод wait(). Если event взведён (set()), то wait прервётся немедленно.
Правда, я не помню, как он сигнализирует о таймауте - если исключением, его нужно ловить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы