Converted Timer and HTTP Interface threads to daemons for cleaner shutdown.

This commit is contained in:
Paulus Schoutsen 2013-10-08 19:00:10 -07:00
parent 71bd03ed8c
commit b9212514bd
3 changed files with 7 additions and 40 deletions

View File

@ -17,7 +17,6 @@ logging.basicConfig(level=logging.INFO)
ALL_EVENTS = '*' ALL_EVENTS = '*'
EVENT_START = "start" EVENT_START = "start"
EVENT_SHUTDOWN = "shutdown"
EVENT_STATE_CHANGED = "state_changed" EVENT_STATE_CHANGED = "state_changed"
EVENT_TIME_CHANGED = "time_changed" EVENT_TIME_CHANGED = "time_changed"
@ -41,9 +40,6 @@ def start_home_assistant(eventbus):
time.sleep(1) time.sleep(1)
except KeyboardInterrupt: except KeyboardInterrupt:
print ""
eventbus.fire(EVENT_SHUTDOWN)
break break
def ensure_list(parameter): def ensure_list(parameter):
@ -218,31 +214,25 @@ class Timer(threading.Thread):
def __init__(self, eventbus): def __init__(self, eventbus):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.daemon = True
self.eventbus = eventbus self.eventbus = eventbus
self._stop = threading.Event()
eventbus.listen(EVENT_START, lambda event: self.start()) eventbus.listen(EVENT_START, lambda event: self.start())
eventbus.listen(EVENT_SHUTDOWN, lambda event: self._stop.set())
def run(self): def run(self):
""" Start the timer. """ """ Start the timer. """
logging.getLogger(__name__).info("Timer:starting") logging.getLogger(__name__).info("Timer:starting")
now = datetime.now()
while True: while True:
while True: while True:
time.sleep(1) time.sleep(1)
now = datetime.now() now = datetime.now()
if self._stop.isSet() or now.second % TIMER_INTERVAL == 0: if now.second % TIMER_INTERVAL == 0:
break break
if self._stop.isSet():
break
self.eventbus.fire(EVENT_TIME_CHANGED, {'now':now}) self.eventbus.fire(EVENT_TIME_CHANGED, {'now':now})
class HomeAssistantException(Exception): class HomeAssistantException(Exception):

View File

@ -31,9 +31,7 @@ import logging
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from urlparse import urlparse, parse_qs from urlparse import urlparse, parse_qs
import requests from . import EVENT_START
from . import EVENT_START, EVENT_SHUTDOWN
SERVER_PORT = 8123 SERVER_PORT = 8123
@ -49,6 +47,8 @@ class HTTPInterface(threading.Thread):
server_port=None, server_host=None): server_port=None, server_host=None):
threading.Thread.__init__(self) threading.Thread.__init__(self)
self.daemon = True
if not server_port: if not server_port:
server_port = SERVER_PORT server_port = SERVER_PORT
@ -64,29 +64,13 @@ class HTTPInterface(threading.Thread):
self.server.statemachine = statemachine self.server.statemachine = statemachine
self.server.api_password = api_password self.server.api_password = api_password
self._stop = threading.Event()
eventbus.listen(EVENT_START, lambda event: self.start()) eventbus.listen(EVENT_START, lambda event: self.start())
eventbus.listen(EVENT_SHUTDOWN, lambda event: self.stop())
def run(self): def run(self):
""" Start the HTTP interface. """ """ Start the HTTP interface. """
self.server.logger.info("Starting") self.server.logger.info("Starting")
while not self._stop.is_set(): self.server.serve_forever()
self.server.handle_request()
def stop(self):
""" Stop the HTTP interface. """
self._stop.set()
# Trigger a fake request to get the server to quit
try:
requests.get("http://127.0.0.1:{}".format(SERVER_PORT),
timeout=0.001)
except requests.exceptions.RequestException:
pass
class RequestHandler(BaseHTTPRequestHandler): class RequestHandler(BaseHTTPRequestHandler):
""" Handles incoming HTTP requests """ """ Handles incoming HTTP requests """

View File

@ -11,7 +11,7 @@ import time
import requests import requests
from . import EventBus, StateMachine, EVENT_START, EVENT_SHUTDOWN from . import EventBus, StateMachine, EVENT_START
from .httpinterface import HTTPInterface, SERVER_PORT from .httpinterface import HTTPInterface, SERVER_PORT
@ -45,13 +45,6 @@ class TestHTTPInterface(unittest.TestCase):
cls.eventbus = EventBus() cls.eventbus = EventBus()
cls.statemachine = StateMachine(cls.eventbus) cls.statemachine = StateMachine(cls.eventbus)
@classmethod
def tearDownClass(cls): # pylint: disable=invalid-name
""" things to be run when tests are done. """
cls.eventbus.fire(EVENT_SHUTDOWN)
time.sleep(1)
def test_debug_interface(self): def test_debug_interface(self):
""" Test if we can login by comparing not logged in screen to """ Test if we can login by comparing not logged in screen to
logged in screen. """ logged in screen. """