49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
from typing import TYPE_CHECKING, Optional
|
|
|
|
if TYPE_CHECKING:
|
|
from redis import Redis
|
|
|
|
from rq.worker import Worker
|
|
|
|
|
|
WORKERS_SUSPENDED = 'rq:suspended'
|
|
|
|
|
|
def is_suspended(connection: 'Redis', worker: Optional['Worker'] = None):
|
|
"""Checks whether a Worker is suspendeed on a given connection
|
|
PS: pipeline returns a list of responses
|
|
Ref: https://github.com/andymccurdy/redis-py#pipelines
|
|
|
|
Args:
|
|
connection (Redis): The Redis Connection
|
|
worker (Optional[Worker], optional): The Worker. Defaults to None.
|
|
"""
|
|
with connection.pipeline() as pipeline:
|
|
if worker is not None:
|
|
worker.heartbeat(pipeline=pipeline)
|
|
pipeline.exists(WORKERS_SUSPENDED)
|
|
return pipeline.execute()[-1]
|
|
|
|
|
|
def suspend(connection: 'Redis', ttl: Optional[int] = None):
|
|
"""
|
|
Suspends.
|
|
TTL of 0 will invalidate right away.
|
|
|
|
Args:
|
|
connection (Redis): The Redis connection to use..
|
|
ttl (Optional[int], optional): time to live in seconds. Defaults to `None`
|
|
"""
|
|
connection.set(WORKERS_SUSPENDED, 1)
|
|
if ttl is not None:
|
|
connection.expire(WORKERS_SUSPENDED, ttl)
|
|
|
|
|
|
def resume(connection: 'Redis'):
|
|
"""
|
|
Resumes.
|
|
|
|
Args:
|
|
connection (Redis): The Redis connection to use..
|
|
"""
|
|
return connection.delete(WORKERS_SUSPENDED)
|