Добавление приоретизации к функции вывода информации (например print) в Python

Есть класс который реализует отправку информационных сообщений в сетевой сервис, однако для тестов я использую простой print в консоль. Существуют несколько типов сообщений которые отличаются различными приоритетами. Для реализации подобного, я написал написал следующий код:

import asyncio


class _Singleton(object):
    """
        Returns previously created instance of the object
    """
    _instances = {}

    def __new__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(_Singleton, cls).__new__(cls)
        return cls._instances[cls]


class PriorityEntry(object):
    def __init__(self, priority, data):
        self.data: dict = data
        self.priority = priority

    def __lt__(self, other):
        return self.priority < other.priority


class PrintMethods:
    async def special_print(self, user_id, msg='', nothing=None, test=''):
        await asyncio.sleep(2)
        print(user_id, msg)
        return True


class PrioTests(object):
    def __init__(self):
        self.print_methods = PrintMethods()
        self.high_prio_print = self.PrioritySend(1, self.print_methods.special_print)
        self.low_prio_print = self.PrioritySend(2, self.print_methods.special_print)

    class PrioritySend(_Singleton):
        def __init__(self, priority, function):
            self._function = function
            self._priority = priority
            if not hasattr(self, '_is_initialized'):
                self.queue = asyncio.PriorityQueue()
                asyncio.create_task(self.worker())
                self._is_initialized = True

        async def __call__(self, *args, **kwargs):
            future = asyncio.Future()
            await self.queue.put(PriorityEntry(self._priority, {'args': args, 'kwargs': kwargs, 'future': future}))
            #await self.queue.put((self._priority, args, kwargs))
            result = await future
            if isinstance(result, Exception):
                raise result
            else:
                return result

        async def worker(self):
            while True:
                q_item = await self.queue.get()
                asyncio.create_task(self.execute_foo(q_item))
                self.queue.task_done()

        async def execute_foo(self, q_item):
            try:
                result = await self._function(*q_item.data.get('args'), **q_item.data.get('kwargs'))
                q_item.data.get('future').set_result(result)
            except Exception as e:
                q_item.data.get('future').set_result(e)


async def main():
    inst = PrioTests()
    tasks = list()
    for i in range(0, 5):
        tasks.append(inst.high_prio_print(1345235, 'High prio msg'))
        tasks.append(inst.low_prio_print(1, 'Low prio msg'))

    result = await asyncio.gather(*tasks)
    print()
asyncio.run(main())

После выполнения я получаю следующий результат:

1345235 High prio msg
1345235 High prio msg
1345235 High prio msg
1 Low prio msg
1345235 High prio msg
1 Low prio msg
1 Low prio msg
1345235 High prio msg
1 Low prio msg
1 Low prio msg

Помогите пожалуйста добится того что бы сначала выводились высокоприоритетные сообщения, а потом низкоприоритетные. Также буду рад примеру, как это можно сделать по другому.


Ответы (0 шт):