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)