This commit is contained in:
Piotr Dec 2025-10-22 23:58:15 +02:00
parent 569aefeccb
commit 3845cc7ecf
Signed by: stawros
GPG key ID: 74B18A3F0F1E99C0
3 changed files with 62 additions and 5 deletions

50
app/core/queue.py Normal file
View file

@ -0,0 +1,50 @@
import time
import uuid
from abc import ABC, abstractmethod
from dataclasses import dataclass
from multiprocessing import Queue, Process
from injectable import injectable
@dataclass
class Task:
_id: uuid.UUID
processor: 'EnqueuedProcessor'
payload: object
@dataclass
class Result:
_id: uuid.UUID
success: bool
error: str | None = None
@injectable(singleton=True)
class ProcessQueue:
def __init__(self):
self._q = Queue()
self._process_thread = Process(target=self._run, args=(self._q,))
self._process_thread.start()
def put(self, task: Task):
self._q.put(task)
def _run(self, queue: Queue):
while True:
if queue.empty():
time.sleep(10)
continue
task = queue.get()
task.processor._process(task.payload)
class EnqueuedProcessor(ABC):
def __init__(self, queue: ProcessQueue):
self._queue = queue
def _enqueue(self, task: Task):
self._queue.put(task)
@abstractmethod
def _process(self, task: Task) -> Result:
pass