2015-04-07 7 views
5

Ich versuche, die autodiscover_tasks Funktion in meiner Anwendung wiederverwendet werden, ohne django zu verwenden, aber es ist immer Valueerror werfen: Leere Modulnamen, wenn autodiscover_tasks in meinem celery.pySellerie autodiscover_tasks arbeitet nicht für Valueerror: Leeres Modulname

consumer/ 
     /__init__.py 
     /celeryapp/ 
        /__init__.py 
        /celery.py 
        /celeryconfig.py 
     /test1/ 
       /__init__.py 
       /tasks.py 
tut

ich führen Sie den Sellerie (/ usr/bin/Sellerie) Befehl in Verbraucher Verzeichnis

$cd /path/to/consumer 
$celery worker -A celeryapp.celery -l debug 

celeryapp/celery.py:

from __future__ import absolute_import 
from celery import Celery 

app = Celery() 
app.config_from_object('celeryapp.celeryconfig') 
app.autodiscover_tasks(['test1']) 

test1/tasks.py:

from __future__ import absolute_import 
from celeryapp.celery import app 

@app.task 
def add(x,y): 
    return x+y 

Fehlermeldung:

$ Sellerie Arbeiter -A celeryapp.celery -l debug

Traceback (most recent call last): 
    File "/usr/bin/celery", line 11, in <module> 
    sys.exit(main()) 
    File "/usr/lib/python2.6/site-packages/celery/__main__.py", line 30, in main 
    main() 
    File "/usr/lib/python2.6/site-packages/celery/bin/celery.py", line 81, in main 
    cmd.execute_from_commandline(argv) 
    File "/usr/lib/python2.6/site-packages/celery/bin/celery.py", line 769, in execute_from_commandline 
    super(CeleryCommand, self).execute_from_commandline(argv))) 
    File "/usr/lib/python2.6/site-packages/celery/bin/base.py", line 307, in execute_from_commandline 
    return self.handle_argv(self.prog_name, argv[1:]) 
    File "/usr/lib/python2.6/site-packages/celery/bin/celery.py", line 761, in handle_argv 
    return self.execute(command, argv) 
    File "/usr/lib/python2.6/site-packages/celery/bin/celery.py", line 693, in execute 
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0]) 
    File "/usr/lib/python2.6/site-packages/celery/bin/worker.py", line 179, in run_from_argv 
    return self(*args, **options) 
    File "/usr/lib/python2.6/site-packages/celery/bin/base.py", line 270, in __call__ 
    ret = self.run(*args, **kwargs) 
    File "/usr/lib/python2.6/site-packages/celery/bin/worker.py", line 212, in run 
    state_db=self.node_format(state_db, hostname), **kwargs 
    File "/usr/lib/python2.6/site-packages/celery/worker/__init__.py", line 95, in __init__ 
    self.app.loader.init_worker() 
    File "/usr/lib/python2.6/site-packages/celery/loaders/base.py", line 128, in init_worker 
    self.import_default_modules() 
    File "/usr/lib/python2.6/site-packages/celery/loaders/base.py", line 116, in import_default_modules 
    signals.import_modules.send(sender=self.app) 
    File "/usr/lib/python2.6/site-packages/celery/utils/dispatch/signal.py", line 166, in send 
    response = receiver(signal=self, sender=sender, **named) 
    File "/usr/lib/python2.6/site-packages/amqp/utils.py", line 42, in __call__ 
    self.set_error_state(exc) 
    File "/usr/lib/python2.6/site-packages/amqp/utils.py", line 39, in __call__ 
    **dict(self.kwargs, **kwargs) if self.kwargs else kwargs 
    File "/usr/lib/python2.6/site-packages/celery/app/base.py", line 329, in _autodiscover_tasks 
    self.loader.autodiscover_tasks(packages, related_name) 
    File "/usr/lib/python2.6/site-packages/celery/loaders/base.py", line 251, in autodiscover_tasks 
    related_name) if mod) 
    File "/usr/lib/python2.6/site-packages/celery/loaders/base.py", line 272, in autodiscover_tasks 
    return [find_related_module(pkg, related_name) for pkg in packages] 
    File "/usr/lib/python2.6/site-packages/celery/loaders/base.py", line 290, in find_related_module 
    pkg_path = importlib.import_module(package).__path__ 
    File "/usr/lib/python2.6/site-packages/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
ValueError: Empty module name 
+1

Ich gerade gefunden dass das seltsame ist, wenn ich in autodiscover_tasks() "force = True" angeben, dann funktioniert es gut. Durch die Überprüfung von Sellerie-Codes scheint dieser Parameter zu bewirken, dass self._autodiscover_tasks() sofort aufgerufen wird, standardmäßig wird er nur verzögert, bis irgendein Signal empfangen wird. Daher nehme ich an, dass dieser Parameter für die Verwendung mit Django optimiert ist, um nur das Laden von faulen Modulen zu implementieren habe keine Ahnung, warum es im Signalhandler fehlgeschlagen ist. – rfancn

+0

Das hat mir geholfen – silentser

Antwort

0

Vor dem autodiscover_tasks Anruf, sollten Sie: 1, os.environ.setdefault ("DJANGO_SETTINGS_MODULE", "dj_gaomu.settings") 2, django.setup()

Verwandte Themen