use sync redis client to sanity check (#2679)

This commit is contained in:
Martin Xu 2024-02-21 07:01:44 -08:00 committed by GitHub
parent 4601cca997
commit a3be76fb75
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 5 deletions

View File

@ -1,4 +1,5 @@
"""Define the reflex state specification.""" """Define the reflex state specification."""
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio

View File

@ -24,6 +24,7 @@ import pkg_resources
import typer import typer
from alembic.util.exc import CommandError from alembic.util.exc import CommandError
from packaging import version from packaging import version
from redis import Redis as RedisSync
from redis.asyncio import Redis from redis.asyncio import Redis
import reflex import reflex
@ -189,16 +190,42 @@ def get_compiled_app(reload: bool = False) -> ModuleType:
def get_redis() -> Redis | None: def get_redis() -> Redis | None:
"""Get the redis client. """Get the asynchronous redis client.
Returns: Returns:
The redis client. The asynchronous redis client.
"""
if isinstance((redis_url_or_options := parse_redis_url()), str):
return Redis.from_url(redis_url_or_options)
elif isinstance(redis_url_or_options, dict):
return Redis(**redis_url_or_options)
return None
def get_redis_sync() -> RedisSync | None:
"""Get the synchronous redis client.
Returns:
The synchronous redis client.
"""
if isinstance((redis_url_or_options := parse_redis_url()), str):
return RedisSync.from_url(redis_url_or_options)
elif isinstance(redis_url_or_options, dict):
return RedisSync(**redis_url_or_options)
return None
def parse_redis_url() -> str | dict | None:
"""Parse the REDIS_URL in config if applicable.
Returns:
If redis-py syntax, return the URL as it is. Otherwise, return the host/port/db as a dict.
""" """
config = get_config() config = get_config()
if not config.redis_url: if not config.redis_url:
return None return None
if config.redis_url.startswith(("redis://", "rediss://", "unix://")): if config.redis_url.startswith(("redis://", "rediss://", "unix://")):
return Redis.from_url(config.redis_url) return config.redis_url
console.deprecate( console.deprecate(
feature_name="host[:port] style redis urls", feature_name="host[:port] style redis urls",
reason="redis-py url syntax is now being used", reason="redis-py url syntax is now being used",
@ -209,7 +236,7 @@ def get_redis() -> Redis | None:
if not has_port: if not has_port:
redis_port = 6379 redis_port = 6379
console.info(f"Using redis at {config.redis_url}") console.info(f"Using redis at {config.redis_url}")
return Redis(host=redis_url, port=int(redis_port), db=0) return dict(host=redis_url, port=int(redis_port), db=0)
def get_production_backend_url() -> str: def get_production_backend_url() -> str:

View File

@ -12,6 +12,7 @@ from typing import Callable, Generator, List, Optional, Tuple, Union
import psutil import psutil
import typer import typer
from redis.exceptions import RedisError
from reflex.utils import console, path_ops, prerequisites from reflex.utils import console, path_ops, prerequisites
@ -28,10 +29,20 @@ def kill(pid):
def get_num_workers() -> int: def get_num_workers() -> int:
"""Get the number of backend worker processes. """Get the number of backend worker processes.
Raises:
Exit: If unable to connect to Redis.
Returns: Returns:
The number of backend worker processes. The number of backend worker processes.
""" """
return 1 if prerequisites.get_redis() is None else (os.cpu_count() or 1) * 2 + 1 if (redis_client := prerequisites.get_redis_sync()) is None:
return 1
try:
redis_client.ping()
except RedisError as re:
console.error(f"Unable to connect to Redis: {re}")
raise typer.Exit(1) from re
return (os.cpu_count() or 1) * 2 + 1
def get_process_on_port(port) -> Optional[psutil.Process]: def get_process_on_port(port) -> Optional[psutil.Process]: