Имеется служба с бесконечным циклом, не могу понять чем заменить 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)