Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.web_stack.transport
"""Web application stack operations
"""
import logging
import threading
log = logging.getLogger(__name__)
[docs]class ApplicationStackTransport:
    SHUTDOWN_MSG = "__SHUTDOWN__"
[docs]    def __init__(self, app, stack, dispatcher=None):
        """Pre-fork initialization."""
        self.app = app
        self.stack = stack
        self.can_run = False
        self.running = False
        self.dispatcher = dispatcher
        self.dispatcher_thread = None
    def _dispatch_messages(self):
        pass
[docs]    def start_if_needed(self):
        # Don't unnecessarily start a thread that we don't need.
        if (
            self.can_run
            and not self.running
            and not self.dispatcher_thread
            and self.dispatcher
            and self.dispatcher.handler_count
        ):
            self.running = True
            self.dispatcher_thread = threading.Thread(
                name=f"{self.__class__.__name__}.dispatcher_thread", target=self._dispatch_messages
            )
            self.dispatcher_thread.start()
            log.info("%s dispatcher started", self.__class__.__name__)
[docs]    def stop_if_unneeded(self):
        if (
            self.can_run
            and self.running
            and self.dispatcher_thread
            and self.dispatcher
            and not self.dispatcher.handler_count
        ):
            self.running = False
            self.dispatcher_thread.join()
            self.dispatcher_thread = None
            log.info("%s dispatcher stopped", self.__class__.__name__)
[docs]    def shutdown(self):
        self.running = False
        if self.dispatcher_thread:
            log.info("Joining application stack transport dispatcher thread")
            self.dispatcher_thread.join()
            self.dispatcher_thread = None