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