Files
local_quantum_simulator/Dockerfile_build/source/main.py
DeOwl 96548e60ea v0.1.0
Changes:
- added rabbitmq hearbeat, consumer and publisher
- fixed vqe to run with rabbitmq
- added frontend via fasthtml
- added proper .env configuration
2026-05-14 13:27:33 +03:00

73 lines
2.0 KiB
Python

import asyncio
import os
from contextlib import asynccontextmanager
import uvicorn
from connections.rabbitmq import rabbitmq_manager
from fasthtml.core import FastHTML, Mount
from modules.fasthtml import app as fasthtml_app
from modules.rabbitmq import consume_messages_topic, publish_heartbeat
async def start_heartbeat():
"""Start heartbeat with auto-reconnect"""
while True:
try:
await publish_heartbeat()
except Exception as e:
print(f"Heartbeat failed: {e}")
await asyncio.sleep(5)
async def start_consumer():
"""Start consumer with auto-reconnect"""
while True:
try:
await consume_messages_topic()
except Exception as e:
print(f"Consumer failed: {e}")
await asyncio.sleep(5)
async def connect_with_retry():
"""Retry RabbitMQ connection until successful"""
while True:
try:
await rabbitmq_manager.connect()
if (
rabbitmq_manager._connection
and not rabbitmq_manager._connection.is_closed
):
print("RabbitMQ connected")
asyncio.create_task(start_heartbeat())
asyncio.create_task(start_consumer())
return
else:
await asyncio.sleep(5)
except Exception as e:
print(f"RabbitMQ connection failed: {e}, retrying in 5 seconds...")
await asyncio.sleep(5)
@asynccontextmanager
async def lifespan(app):
print("Starting up...")
asyncio.create_task(connect_with_retry())
yield
print("Shutting down...")
for task in asyncio.all_tasks():
if task is not asyncio.current_task():
task.cancel()
await rabbitmq_manager.close()
app = FastHTML(routes=[Mount("", fasthtml_app, name="FastHTML")])
app.set_lifespan(lifespan)
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=int(os.environ["PORT"]), reload=True)