Implement FastAPI Temporal MVP pipeline
This commit is contained in:
84
app/workers/runner.py
Normal file
84
app/workers/runner.py
Normal file
@@ -0,0 +1,84 @@
|
||||
"""Temporal worker runner."""
|
||||
|
||||
import asyncio
|
||||
from contextlib import AsyncExitStack
|
||||
|
||||
from temporalio.client import Client
|
||||
from temporalio.worker import Worker
|
||||
|
||||
from app.infra.temporal.client import get_temporal_client
|
||||
from app.infra.temporal.task_queues import (
|
||||
IMAGE_PIPELINE_CONTROL_TASK_QUEUE,
|
||||
IMAGE_PIPELINE_EXPORT_TASK_QUEUE,
|
||||
IMAGE_PIPELINE_IMAGE_GEN_TASK_QUEUE,
|
||||
IMAGE_PIPELINE_POST_PROCESS_TASK_QUEUE,
|
||||
IMAGE_PIPELINE_QC_TASK_QUEUE,
|
||||
)
|
||||
from app.workers.activities.export_activities import run_export_activity
|
||||
from app.workers.activities.face_activities import run_face_activity
|
||||
from app.workers.activities.fusion_activities import run_fusion_activity
|
||||
from app.workers.activities.qc_activities import run_qc_activity
|
||||
from app.workers.activities.review_activities import (
|
||||
complete_review_wait_activity,
|
||||
mark_waiting_for_review_activity,
|
||||
mark_workflow_failed_activity,
|
||||
)
|
||||
from app.workers.activities.scene_activities import run_scene_activity
|
||||
from app.workers.activities.texture_activities import run_texture_activity
|
||||
from app.workers.activities.tryon_activities import prepare_model_activity, run_tryon_activity
|
||||
from app.workers.workflows.low_end_pipeline import LowEndPipelineWorkflow
|
||||
from app.workers.workflows.mid_end_pipeline import MidEndPipelineWorkflow
|
||||
|
||||
|
||||
def build_workers(client: Client) -> list[Worker]:
|
||||
"""Create the worker set needed for the task queues in this MVP."""
|
||||
|
||||
return [
|
||||
Worker(
|
||||
client,
|
||||
task_queue=IMAGE_PIPELINE_CONTROL_TASK_QUEUE,
|
||||
workflows=[LowEndPipelineWorkflow, MidEndPipelineWorkflow],
|
||||
activities=[
|
||||
prepare_model_activity,
|
||||
mark_waiting_for_review_activity,
|
||||
complete_review_wait_activity,
|
||||
mark_workflow_failed_activity,
|
||||
],
|
||||
),
|
||||
Worker(
|
||||
client,
|
||||
task_queue=IMAGE_PIPELINE_IMAGE_GEN_TASK_QUEUE,
|
||||
activities=[run_tryon_activity, run_scene_activity],
|
||||
),
|
||||
Worker(
|
||||
client,
|
||||
task_queue=IMAGE_PIPELINE_POST_PROCESS_TASK_QUEUE,
|
||||
activities=[run_texture_activity, run_face_activity, run_fusion_activity],
|
||||
),
|
||||
Worker(
|
||||
client,
|
||||
task_queue=IMAGE_PIPELINE_QC_TASK_QUEUE,
|
||||
activities=[run_qc_activity],
|
||||
),
|
||||
Worker(
|
||||
client,
|
||||
task_queue=IMAGE_PIPELINE_EXPORT_TASK_QUEUE,
|
||||
activities=[run_export_activity],
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
async def run_workers() -> None:
|
||||
"""Start all Temporal workers and keep the process alive."""
|
||||
|
||||
client = await get_temporal_client()
|
||||
workers = build_workers(client)
|
||||
async with AsyncExitStack() as stack:
|
||||
for worker in workers:
|
||||
await stack.enter_async_context(worker)
|
||||
await asyncio.Event().wait()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(run_workers())
|
||||
|
||||
Reference in New Issue
Block a user