Lin / backend /start_celery.py
Zelyanoth's picture
mm
4eeabd7
raw
history blame
3.88 kB
#!/usr/bin/env python3
"""
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
# Add the backend directory to Python 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...")
# Add project root to PYTHONPATH
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",
"--events" # Enable task events for monitoring
]
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...")
# Add project root to PYTHONPATH
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" # Specify writable location for schedule file
]
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()