예제 #1
0
class MessageQueue(object):
    """ MessageQueue class for queues """

    __slots__ = ('_queue', )

    def __init__(self, queue=None, messages=None, *args):
        """
    MessageQueue class constructor
    :param queue: queue|None, queue instance
    :param messages: tuple|list|None, messages
    :param args: mixed, default messages
    """
        # initialize queue variable
        self._queue = Queue() \
          if queue is None else queue
        # initialize default values
        if messages:
            for item in messages:
                self.put(item)
        if args:
            for item in args:
                self.put(item)

    def __call__(self, message=None, *args, **kwargs):
        """
    Alias for get & put a message to queue
    :param message: mixed|None, a message
    :param args: mixed, the arguments
    :param kwargs: dict, the kw arguments
    :return: None|mixed, a message
    """
        # check if message is set
        if message is None:
            # acquire a message
            return self.get(*args, **kwargs)
        else:
            # dispatch a message
            self.put(message, *args, **kwargs)

    def __getattr__(self, key):
        """
    Expose queue's attributes
    :param key: str, the attribute name
    :return: mixed, the queue properties
    """
        return self._queue.__getattribute__(key)

    def put(self, message, *args, **kwargs):
        """
    Put one message to queue with blocking
    :param message: mixed, a message
    :param args: mixed, the arguments
    :param kwargs: dict, the kw arguments
    :return: None
    """
        # put a message
        self._queue.put(message, *args, **kwargs)

    # aliases for put
    set = send = put

    def get(self, block=True, timeout=None, *args, **kwargs):
        """
    Get one message from queue with blocking
    :param block: bool, whether block or not
    :param timeout, int|None, the timeout
    :param args: mixed, the arguments
    :param kwargs: dict, the kw arguments
    :return: mixed, a message
    """
        # check if blocking and empty
        if not block and self._queue.empty():
            return None
        # acquire a message
        try:
            message = self._queue.get(block, timeout, *args, **kwargs)
        except Empty:
            return None
        return message

    # aliases for get
    recv = get

    # alias for get & put message
    msg = property(get, put)