|
|
|
""" |
|
Script to start Celery components for the Lin application. |
|
This script provides a unified way to start Celery worker and beat scheduler. |
|
""" |
|
|
|
import os |
|
import sys |
|
import subprocess |
|
import platform |
|
from pathlib import Path |
|
|
|
|
|
backend_dir = Path(__file__).parent |
|
sys.path.insert(0, str(backend_dir)) |
|
|
|
def check_redis(): |
|
"""Check if Redis is running.""" |
|
try: |
|
import redis |
|
client = redis.Redis(host='localhost', port=6379, db=0) |
|
client.ping() |
|
print("β Redis connection successful") |
|
return True |
|
except Exception as e: |
|
print(f"β Redis connection failed: {e}") |
|
print("Please start Redis server first:") |
|
print(" Windows: redis-server") |
|
print(" Linux/Mac: sudo systemctl start redis") |
|
return False |
|
|
|
def start_worker(): |
|
"""Start Celery worker.""" |
|
print("Starting Celery worker...") |
|
|
|
project_root = backend_dir.parent.resolve() |
|
env = os.environ.copy() |
|
current_pythonpath = env.get('PYTHONPATH', '') |
|
env['PYTHONPATH'] = str(project_root) + os.pathsep + current_pythonpath if current_pythonpath else str(project_root) |
|
|
|
cmd = [ |
|
sys.executable, "-m", "celery", |
|
"-A", "celery_config:celery_app", |
|
"worker", |
|
"--loglevel=info", |
|
"--pool=solo", |
|
"--max-tasks-per-child=100" |
|
] |
|
|
|
if platform.system() == "Windows": |
|
subprocess.Popen(cmd, cwd=backend_dir, env=env) |
|
else: |
|
subprocess.Popen(cmd, cwd=backend_dir, env=env) |
|
|
|
print("Celery worker started") |
|
|
|
def start_beat(): |
|
"""Start Celery Beat scheduler.""" |
|
print("Starting Celery Beat scheduler...") |
|
|
|
project_root = backend_dir.parent.resolve() |
|
env = os.environ.copy() |
|
current_pythonpath = env.get('PYTHONPATH', '') |
|
env['PYTHONPATH'] = str(project_root) + os.pathsep + current_pythonpath if current_pythonpath else str(project_root) |
|
|
|
cmd = [ |
|
sys.executable, "-m", "celery", |
|
"-A", "celery_config:celery_app", |
|
"beat", |
|
"--loglevel=info", |
|
"--schedule=/tmp/celerybeat-schedule" |
|
] |
|
|
|
if platform.system() == "Windows": |
|
subprocess.Popen(cmd, cwd=backend_dir, env=env) |
|
else: |
|
subprocess.Popen(cmd, cwd=backend_dir, env=env) |
|
|
|
print("Celery Beat scheduler started") |
|
|
|
def start_all(): |
|
"""Start both worker and beat.""" |
|
if not check_redis(): |
|
return False |
|
|
|
print("Starting all Celery components...") |
|
start_worker() |
|
start_beat() |
|
print("All Celery components started") |
|
return True |
|
|
|
def main(): |
|
"""Main function.""" |
|
if len(sys.argv) < 2: |
|
print("Usage: python start_celery.py <command>") |
|
print("Commands:") |
|
print(" worker - Start Celery worker only") |
|
print(" beat - Start Celery Beat scheduler only") |
|
print(" all - Start both worker and beat") |
|
print(" check - Check system requirements") |
|
sys.exit(1) |
|
|
|
command = sys.argv[1].lower() |
|
|
|
if command == "worker": |
|
if not check_redis(): |
|
sys.exit(1) |
|
start_worker() |
|
elif command == "beat": |
|
if not check_redis(): |
|
sys.exit(1) |
|
start_beat() |
|
elif command == "all": |
|
if not start_all(): |
|
sys.exit(1) |
|
elif command == "check": |
|
print("Checking system requirements...") |
|
if check_redis(): |
|
print("β All requirements met") |
|
else: |
|
print("β Some requirements not met") |
|
sys.exit(1) |
|
else: |
|
print(f"Unknown command: {command}") |
|
sys.exit(1) |
|
|
|
if __name__ == "__main__": |
|
main() |