mirror of https://github.com/peter4431/rq.git
Merge pull request #420 from zhangliyong/cli-rq-worker
Convert `rqworker` to `rq worker` subcommandmain
commit
bc6d30e473
@ -1,65 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import (absolute_import, division, print_function,
|
|
||||||
unicode_literals)
|
|
||||||
|
|
||||||
import importlib
|
|
||||||
import os
|
|
||||||
from functools import partial
|
|
||||||
from warnings import warn
|
|
||||||
|
|
||||||
import redis
|
|
||||||
from rq import use_connection
|
|
||||||
from rq.utils import first
|
|
||||||
|
|
||||||
|
|
||||||
def add_standard_arguments(parser):
|
|
||||||
parser.add_argument('--config', '-c', default=None,
|
|
||||||
help='Module containing RQ settings.')
|
|
||||||
parser.add_argument('--url', '-u', default=None,
|
|
||||||
help='URL describing Redis connection details. '
|
|
||||||
'Overrides other connection arguments if supplied.')
|
|
||||||
parser.add_argument('--host', '-H', default=None,
|
|
||||||
help='The Redis hostname (default: localhost)')
|
|
||||||
parser.add_argument('--port', '-p', default=None,
|
|
||||||
help='The Redis portnumber (default: 6379)')
|
|
||||||
parser.add_argument('--db', '-d', type=int, default=None,
|
|
||||||
help='The Redis database (default: 0)')
|
|
||||||
parser.add_argument('--password', '-a', default=None,
|
|
||||||
help='The Redis password (default: None)')
|
|
||||||
parser.add_argument('--socket', '-s', default=None,
|
|
||||||
help='The Redis Unix socket')
|
|
||||||
|
|
||||||
|
|
||||||
def read_config_file(module):
|
|
||||||
"""Reads all UPPERCASE variables defined in the given module file."""
|
|
||||||
settings = importlib.import_module(module)
|
|
||||||
return dict([(k, v)
|
|
||||||
for k, v in settings.__dict__.items()
|
|
||||||
if k.upper() == k])
|
|
||||||
|
|
||||||
|
|
||||||
def setup_default_arguments(args, settings):
|
|
||||||
""" Sets up args from settings or defaults """
|
|
||||||
args.url = first([args.url, settings.get('REDIS_URL'), os.environ.get('RQ_REDIS_URL')])
|
|
||||||
|
|
||||||
if (args.host or args.port or args.socket or args.db or args.password):
|
|
||||||
warn('Host, port, db, password options for Redis will not be '
|
|
||||||
'supported in future versions of RQ. '
|
|
||||||
'Please use `REDIS_URL` or `--url` instead.', DeprecationWarning)
|
|
||||||
|
|
||||||
strict_first = partial(first, key=lambda obj: obj is not None)
|
|
||||||
|
|
||||||
args.host = strict_first([args.host, settings.get('REDIS_HOST'), os.environ.get('RQ_REDIS_HOST'), 'localhost'])
|
|
||||||
args.port = int(strict_first([args.port, settings.get('REDIS_PORT'), os.environ.get('RQ_REDIS_PORT'), 6379]))
|
|
||||||
args.socket = strict_first([args.socket, settings.get('REDIS_SOCKET'), os.environ.get('RQ_REDIS_SOCKET'), None])
|
|
||||||
args.db = strict_first([args.db, settings.get('REDIS_DB'), os.environ.get('RQ_REDIS_DB'), 0])
|
|
||||||
args.password = strict_first([args.password, settings.get('REDIS_PASSWORD'), os.environ.get('RQ_REDIS_PASSWORD')])
|
|
||||||
|
|
||||||
|
|
||||||
def setup_redis(args):
|
|
||||||
if args.url is not None:
|
|
||||||
redis_conn = redis.StrictRedis.from_url(args.url)
|
|
||||||
else:
|
|
||||||
redis_conn = redis.StrictRedis(host=args.host, port=args.port, db=args.db,
|
|
||||||
password=args.password, unix_socket_path=args.socket)
|
|
||||||
use_connection(redis_conn)
|
|
@ -1,102 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import (absolute_import, division, print_function,
|
|
||||||
unicode_literals)
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from redis.exceptions import ConnectionError
|
|
||||||
from rq.contrib.legacy import cleanup_ghosts
|
|
||||||
from rq.logutils import setup_loghandlers
|
|
||||||
from rq.scripts import (add_standard_arguments, read_config_file,
|
|
||||||
setup_default_arguments, setup_redis)
|
|
||||||
from rq.utils import import_attribute
|
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
|
||||||
parser = argparse.ArgumentParser(description='Starts an RQ worker.')
|
|
||||||
add_standard_arguments(parser)
|
|
||||||
|
|
||||||
parser.add_argument('--burst', '-b', action='store_true', default=False, help='Run in burst mode (quit after all work is done)') # noqa
|
|
||||||
parser.add_argument('--name', '-n', default=None, help='Specify a different name')
|
|
||||||
parser.add_argument('--worker-class', '-w', action='store', default='rq.Worker', help='RQ Worker class to use')
|
|
||||||
parser.add_argument('--job-class', '-j', action='store', default='rq.job.Job', help='RQ Job class to use')
|
|
||||||
parser.add_argument('--queue-class', action='store', default='rq.Queue', help='RQ Queue class to use')
|
|
||||||
parser.add_argument('--path', '-P', default='.', help='Specify the import path.')
|
|
||||||
parser.add_argument('--results-ttl', default=None, help='Default results timeout to be used')
|
|
||||||
parser.add_argument('--worker-ttl', type=int, default=None, help='Default worker timeout to be used')
|
|
||||||
parser.add_argument('--verbose', '-v', action='store_true', default=False, help='Show more output')
|
|
||||||
parser.add_argument('--quiet', '-q', action='store_true', default=False, help='Show less output')
|
|
||||||
parser.add_argument('--sentry-dsn', action='store', default=None, metavar='URL', help='Report exceptions to this Sentry DSN') # noqa
|
|
||||||
parser.add_argument('--pid', action='store', default=None,
|
|
||||||
help='Write the process ID number to a file at the specified path')
|
|
||||||
parser.add_argument('queues', nargs='*', help='The queues to listen on (default: \'default\')')
|
|
||||||
|
|
||||||
return parser.parse_args()
|
|
||||||
|
|
||||||
|
|
||||||
def setup_loghandlers_from_args(args):
|
|
||||||
if args.verbose and args.quiet:
|
|
||||||
raise RuntimeError("Flags --verbose and --quiet are mutually exclusive.")
|
|
||||||
|
|
||||||
if args.verbose:
|
|
||||||
level = 'DEBUG'
|
|
||||||
elif args.quiet:
|
|
||||||
level = 'WARNING'
|
|
||||||
else:
|
|
||||||
level = 'INFO'
|
|
||||||
setup_loghandlers(level)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
args = parse_args()
|
|
||||||
|
|
||||||
if args.path:
|
|
||||||
sys.path = args.path.split(':') + sys.path
|
|
||||||
|
|
||||||
settings = {}
|
|
||||||
if args.config:
|
|
||||||
settings = read_config_file(args.config)
|
|
||||||
|
|
||||||
setup_default_arguments(args, settings)
|
|
||||||
|
|
||||||
# Worker specific default arguments
|
|
||||||
if not args.queues:
|
|
||||||
args.queues = settings.get('QUEUES', ['default'])
|
|
||||||
|
|
||||||
if args.sentry_dsn is None:
|
|
||||||
args.sentry_dsn = settings.get('SENTRY_DSN',
|
|
||||||
os.environ.get('SENTRY_DSN', None))
|
|
||||||
|
|
||||||
if args.pid:
|
|
||||||
with open(os.path.expanduser(args.pid), "w") as fp:
|
|
||||||
fp.write(str(os.getpid()))
|
|
||||||
|
|
||||||
setup_loghandlers_from_args(args)
|
|
||||||
setup_redis(args)
|
|
||||||
|
|
||||||
cleanup_ghosts()
|
|
||||||
worker_class = import_attribute(args.worker_class)
|
|
||||||
queue_class = import_attribute(args.queue_class)
|
|
||||||
|
|
||||||
try:
|
|
||||||
queues = list(map(queue_class, args.queues))
|
|
||||||
w = worker_class(queues,
|
|
||||||
name=args.name,
|
|
||||||
default_worker_ttl=args.worker_ttl,
|
|
||||||
default_result_ttl=args.results_ttl,
|
|
||||||
job_class=args.job_class)
|
|
||||||
|
|
||||||
# Should we configure Sentry?
|
|
||||||
if args.sentry_dsn:
|
|
||||||
from raven import Client
|
|
||||||
from rq.contrib.sentry import register_sentry
|
|
||||||
client = Client(args.sentry_dsn)
|
|
||||||
register_sentry(client, w)
|
|
||||||
|
|
||||||
w.work(burst=args.burst)
|
|
||||||
except ConnectionError as e:
|
|
||||||
print(e)
|
|
||||||
sys.exit(1)
|
|
Loading…
Reference in New Issue