Добавление приоретизации к функции вывода информации (например 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
Помогите пожалуйста добится того что бы сначала выводились высокоприоритетные сообщения, а потом низкоприоритетные. Также буду рад примеру, как это можно сделать по другому.