-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathstart_all_services.py
More file actions
executable file
·130 lines (97 loc) · 3.76 KB
/
start_all_services.py
File metadata and controls
executable file
·130 lines (97 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env python3
"""
Start all PAPR Memory Server services
- Web server (FastAPI)
- Memory processing Temporal worker
- Document processing Temporal worker
"""
import asyncio
import signal
import sys
from multiprocessing import Process
from pathlib import Path
# Add project root to path
sys.path.insert(0, str(Path(__file__).parent))
def run_web_server():
"""Run the FastAPI web server"""
import uvicorn
from services.logger_singleton import LoggerSingleton
logger = LoggerSingleton.get_logger(__name__)
logger.info("Starting web server...")
uvicorn.run(
"main:app",
host="0.0.0.0",
port=5001,
log_level="info",
access_log=True,
)
def run_memory_worker():
"""Run the memory processing Temporal worker"""
import start_temporal_worker
from services.logger_singleton import LoggerSingleton
logger = LoggerSingleton.get_logger(__name__)
logger.info("Starting memory processing Temporal worker...")
asyncio.run(start_temporal_worker.main())
def run_document_worker():
"""Run the document processing Temporal worker"""
import start_document_worker
from services.logger_singleton import LoggerSingleton
logger = LoggerSingleton.get_logger(__name__)
logger.info("Starting document processing Temporal worker...")
asyncio.run(start_document_worker.main())
def main():
"""Start all services as separate processes"""
from services.logger_singleton import LoggerSingleton
logger = LoggerSingleton.get_logger(__name__)
logger.info("Starting PAPR Memory Server with all services...")
# Create processes
processes = []
# Web server
web_process = Process(target=run_web_server, name="WebServer")
web_process.start()
processes.append(web_process)
logger.info(f"Web server started (PID: {web_process.pid})")
# Memory worker
memory_worker = Process(target=run_memory_worker, name="MemoryWorker")
memory_worker.start()
processes.append(memory_worker)
logger.info(f"Memory worker started (PID: {memory_worker.pid})")
# Document worker
doc_worker = Process(target=run_document_worker, name="DocumentWorker")
doc_worker.start()
processes.append(doc_worker)
logger.info(f"Document worker started (PID: {doc_worker.pid})")
logger.info("All services started successfully!")
# Handle shutdown gracefully
def signal_handler(signum, frame):
logger.info(f"Received signal {signum}, shutting down all services...")
for process in processes:
if process.is_alive():
logger.info(f"Terminating {process.name} (PID: {process.pid})...")
process.terminate()
# Wait for all processes to finish
for process in processes:
process.join(timeout=10)
if process.is_alive():
logger.warning(f"Force killing {process.name} (PID: {process.pid})...")
process.kill()
logger.info("All services stopped")
sys.exit(0)
# Register signal handlers
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGINT, signal_handler)
# Wait for any process to exit
try:
import time
while all(p.is_alive() for p in processes):
time.sleep(1)
# If any process died, log and exit
for process in processes:
if not process.is_alive():
logger.error(f"{process.name} exited unexpectedly (exit code: {process.exitcode})")
# Terminate remaining processes
signal_handler(signal.SIGTERM, None)
except KeyboardInterrupt:
signal_handler(signal.SIGINT, None)
if __name__ == "__main__":
main()