Add job processing system with streaming endpoint
Introduced a `processing` router to handle job streaming using server-sent events. Added `Jobs` and `JobStatus` models for managing job-related data, along with database creation logic. Updated the `sample` router to create new job entries during experiment creation.
This commit is contained in:
@ -5,6 +5,7 @@ from .proposal import router as proposal_router
|
||||
from .dewar import dewar_router
|
||||
from .shipment import shipment_router
|
||||
from .auth import router as auth_router
|
||||
from .processing import router as processing_router
|
||||
from .protected_router import protected_router as protected_router
|
||||
|
||||
__all__ = [
|
||||
@ -15,5 +16,6 @@ __all__ = [
|
||||
"dewar_router",
|
||||
"shipment_router",
|
||||
"auth_router",
|
||||
"processing_router",
|
||||
"protected_router",
|
||||
]
|
||||
|
24
backend/app/routers/processing.py
Normal file
24
backend/app/routers/processing.py
Normal file
@ -0,0 +1,24 @@
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from starlette.responses import StreamingResponse
|
||||
import asyncio
|
||||
import json
|
||||
|
||||
from app.models import JobStatus, Jobs as JobModel
|
||||
from app.dependencies import get_db
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
async def job_event_generator(db):
|
||||
while True:
|
||||
jobs = db.query(JobModel).filter(JobModel.status == JobStatus.TODO).all()
|
||||
|
||||
if jobs:
|
||||
yield json.dumps([job.parameters for job in jobs]) + "\n\n"
|
||||
await asyncio.sleep(5)
|
||||
|
||||
|
||||
@router.get("/jobs/stream")
|
||||
async def stream_jobs(db: Session = Depends(get_db)):
|
||||
return StreamingResponse(job_event_generator(db), media_type="text/event-stream")
|
@ -28,6 +28,8 @@ from app.models import (
|
||||
ExperimentParameters as ExperimentParametersModel,
|
||||
# ExperimentParameters,
|
||||
Results as ResultsModel,
|
||||
Jobs as JobModel,
|
||||
JobStatus,
|
||||
)
|
||||
from app.dependencies import get_db
|
||||
import logging
|
||||
@ -348,6 +350,15 @@ def create_experiment_parameters_for_sample(
|
||||
db.add(new_event)
|
||||
db.commit()
|
||||
|
||||
new_job = JobModel(
|
||||
experiment_parameters_id=new_exp.id, # <-- Correct reference here
|
||||
parameters=new_exp.to_dict(), # assuming params has a to_dict() method
|
||||
status=JobStatus.TODO,
|
||||
)
|
||||
db.add(new_job)
|
||||
db.commit()
|
||||
db.refresh(new_job)
|
||||
|
||||
return new_exp
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user