127 lines
3.9 KiB
Python
127 lines
3.9 KiB
Python
|
import imp
|
||
|
import sys
|
||
|
from optparse import make_option
|
||
|
|
||
|
from django.conf import settings
|
||
|
from django.core.management.base import BaseCommand
|
||
|
try:
|
||
|
from importlib import import_module
|
||
|
except ImportError:
|
||
|
from django.utils.importlib import import_module
|
||
|
|
||
|
try:
|
||
|
from django.apps import apps as django_apps
|
||
|
HAS_DJANGO_APPS = True
|
||
|
except ImportError:
|
||
|
# Django 1.6
|
||
|
HAS_DJANGO_APPS = False
|
||
|
|
||
|
from huey.consumer import Consumer
|
||
|
from huey.bin.huey_consumer import get_loglevel
|
||
|
from huey.bin.huey_consumer import setup_logger
|
||
|
|
||
|
|
||
|
class Command(BaseCommand):
|
||
|
"""
|
||
|
Queue consumer. Example usage::
|
||
|
|
||
|
To start the consumer (note you must export the settings module):
|
||
|
|
||
|
django-admin.py run_huey
|
||
|
"""
|
||
|
help = "Run the queue consumer"
|
||
|
|
||
|
option_list = BaseCommand.option_list + (
|
||
|
make_option('--periodic', '-p',
|
||
|
dest='periodic',
|
||
|
action='store_true',
|
||
|
help='Enqueue periodic commands'
|
||
|
),
|
||
|
make_option('--no-periodic', '-n',
|
||
|
dest='periodic',
|
||
|
action='store_false',
|
||
|
help='Do not enqueue periodic commands'
|
||
|
),
|
||
|
make_option('--workers', '-w',
|
||
|
dest='workers',
|
||
|
type='int',
|
||
|
help='Number of worker threads'
|
||
|
),
|
||
|
make_option('--delay', '-d',
|
||
|
dest='initial_delay',
|
||
|
type='float',
|
||
|
help='Delay between polling requests'
|
||
|
),
|
||
|
make_option('--max_delay', '-m',
|
||
|
dest='max_delay',
|
||
|
type='float',
|
||
|
help='Maximum delay between polling requests'
|
||
|
),
|
||
|
)
|
||
|
|
||
|
def autodiscover_appconfigs(self):
|
||
|
"""Use Django app registry to pull out potential apps with tasks.py module."""
|
||
|
module_name = 'tasks'
|
||
|
for config in django_apps.get_app_configs():
|
||
|
app_path = config.module.__path__
|
||
|
try:
|
||
|
fp, path, description = imp.find_module(module_name, app_path)
|
||
|
except ImportError:
|
||
|
continue
|
||
|
else:
|
||
|
import_path = '%s.%s' % (config.name, module_name)
|
||
|
imp.load_module(import_path, fp, path, description)
|
||
|
|
||
|
def autodiscover_old(self):
|
||
|
# this is to find modules named <commands.py> in a django project's
|
||
|
# installed apps directories
|
||
|
module_name = 'tasks'
|
||
|
|
||
|
for app in settings.INSTALLED_APPS:
|
||
|
try:
|
||
|
import_module(app)
|
||
|
app_path = sys.modules[app].__path__
|
||
|
except AttributeError:
|
||
|
continue
|
||
|
try:
|
||
|
imp.find_module(module_name, app_path)
|
||
|
except ImportError:
|
||
|
continue
|
||
|
import_module('%s.%s' % (app, module_name))
|
||
|
app_path = sys.modules['%s.%s' % (app, module_name)]
|
||
|
|
||
|
def autodiscover(self):
|
||
|
"""Switch between Django 1.7 style and old style app importing."""
|
||
|
if HAS_DJANGO_APPS:
|
||
|
self.autodiscover_appconfigs()
|
||
|
else:
|
||
|
self.autodiscover_old()
|
||
|
|
||
|
def handle(self, *args, **options):
|
||
|
from huey.djhuey import HUEY
|
||
|
try:
|
||
|
consumer_options = settings.HUEY['consumer_options']
|
||
|
except:
|
||
|
consumer_options = {}
|
||
|
|
||
|
if options['workers'] is not None:
|
||
|
consumer_options['workers'] = options['workers']
|
||
|
|
||
|
if options['periodic'] is not None:
|
||
|
consumer_options['periodic'] = options['periodic']
|
||
|
|
||
|
if options['initial_delay'] is not None:
|
||
|
consumer_options['initial_delay'] = options['initial_delay']
|
||
|
|
||
|
if options['max_delay'] is not None:
|
||
|
consumer_options['max_delay'] = options['max_delay']
|
||
|
|
||
|
self.autodiscover()
|
||
|
|
||
|
loglevel = get_loglevel(consumer_options.pop('loglevel', None))
|
||
|
logfile = consumer_options.pop('logfile', None)
|
||
|
setup_logger(loglevel, logfile)
|
||
|
|
||
|
consumer = Consumer(HUEY, **consumer_options)
|
||
|
consumer.run()
|