ProspectIQ / scripts /start_celery_worker.py
praneelchettys's picture
fix(celery): robust Celery configuration for local development and production deployments
24a6a42
Raw History Blame Contribute Delete
2.29 kB
import os
import sys
import subprocess
from urllib.parse import urlparse
from dotenv import load_dotenv
load_dotenv()
# Add project root to sys.path
PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
if PROJECT_ROOT not in sys.path:
sys.path.insert(0, PROJECT_ROOT)
from celery_app import celery_app, celery_worker_health
def main():
print("=" * 60)
print(" ProspectIQ Celery Worker Launcher")
print("=" * 60)
broker_url = celery_app.conf.broker_url or "redis://127.0.0.1:6379/0"
parsed = urlparse(str(broker_url))
print(f"Broker URL: {parsed.scheme}://{parsed.hostname}:{parsed.port}")
print(f"Platform: {sys.platform}")
# Check if broker is reachable
print("\nChecking broker connectivity...")
try:
if parsed.scheme in {"redis", "rediss"}:
import redis
kwargs = {"socket_connect_timeout": 3, "socket_timeout": 3}
if parsed.scheme == "rediss":
import ssl
kwargs["ssl_cert_reqs"] = ssl.CERT_NONE
client = redis.Redis.from_url(str(broker_url), **kwargs)
client.ping()
print(" [OK] Redis broker connection successful.")
except Exception as exc:
print(f" [WARN] Redis connection check failed: {exc}")
print(" Ensure your Redis server is running (e.g. docker run -p 6379:6379 redis:7-alpine)")
# Select appropriate pool
pool = os.environ.get("CELERY_WORKER_POOL")
if not pool:
pool = "solo" if sys.platform == "win32" else "solo"
concurrency = os.environ.get("CELERY_WORKER_CONCURRENCY", "1")
loglevel = os.environ.get("CELERY_LOG_LEVEL", "info")
print(f"Worker Pool: {pool}")
print(f"Concurrency: {concurrency}")
print(f"Log Level: {loglevel}\n")
print("Starting Celery worker...\n" + "-" * 60)
cmd = [
sys.executable,
"-m",
"celery",
"-A",
"celery_app.celery_app",
"worker",
f"--loglevel={loglevel}",
f"--pool={pool}",
f"--concurrency={concurrency}",
]
try:
subprocess.run(cmd, cwd=PROJECT_ROOT, check=True)
except KeyboardInterrupt:
print("\nCelery worker stopped.")
if __name__ == "__main__":
main()