Seler Otrzymano niezarejestrowane zadanie typu (przykład uruchomienia)

98

Próbuję uruchomić przykład z dokumentacji Seleru.

Biegnę: celeryd --loglevel=INFO

/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python.
  "is available to Python." % (configname, )))
[2012-03-19 04:26:34,899: WARNING/MainProcess]  

 -------------- celery@ubuntu v2.5.1
---- **** -----
--- * ***  * -- [Configuration]
-- * - **** ---   . broker:      amqp://guest@localhost:5672//
- ** ----------   . loader:      celery.loaders.default.Loader
- ** ----------   . logfile:     [stderr]@INFO
- ** ----------   . concurrency: 4
- ** ----------   . events:      OFF
- *** --- * ---   . beat:        OFF
-- ******* ----
--- ***** ----- [Queues]
 --------------   . celery:      exchange:celery (direct) binding:celery

tasks.py:

# -*- coding: utf-8 -*-
from celery.task import task

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

run_task.py:

# -*- coding: utf-8 -*-
from tasks import add
result = add.delay(4, 4)
print (result)
print (result.ready())
print (result.get())

W tym samym folderze celeryconfig.py:

CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300

Kiedy uruchamiam „run_task.py”:

na konsoli Pythona

eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False

błędy na serwerze celeryd

[2012-03-19 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'}

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message
    self.strategies[name](message, body, message.ack_log_error)
KeyError: 'tasks.add'

Proszę wyjaśnić, na czym polega problem.

Echeg
źródło
12
Cześć, czy mógłbyś podzielić się, na czym polegał problem i jak go rozwiązałeś? Przyjęta odpowiedź nie wyjaśnia, jak inni mogliby rozwiązać ten problem. Dzięki.
Jordan Reiter
3
Jestem z Jordan - to w ogóle nie było przydatne. Głosowano w dół.
Jay Taylor,
2
odpowiedź aiho jest prawidłowa:CELERY_IMPORTS = ("tasks", )
Alp

Odpowiedzi:

50

Możesz zobaczyć aktualną listę zarejestrowanych zadań w celery.registry.TaskRegistryklasie. Możliwe, że twojego celeryconfig (w bieżącym katalogu) nie ma, PYTHONPATHwięc seler nie może go znaleźć i wraca do ustawień domyślnych. Po prostu określ to wyraźnie, rozpoczynając seler.

celeryd --loglevel=INFO --settings=celeryconfig

Możesz także ustawić --loglevel=DEBUGi prawdopodobnie powinieneś natychmiast zobaczyć problem.

astevanovic
źródło
4
+1 za --loglevel=DEBUG, w moim zadaniu wystąpił błąd składni.
Jacob Valenta,
15
seler jest przestarzały. Teraz należy biegać celery workernp. Po Djangotocelery --app=your_app.celery worker --loglevel=info
andilabs
Dla mnie (seler 3.1.23) musiałem użyć, celery.registry.tasksaby zobaczyć listę wszystkich moich bieżących zadań. Zawsze możesz to sprawdzić, uruchamiając dir(celery.registry).
Nick Brady
także --loglevel=DEBUGz mojej strony
Shobi
64

Myślę, że musisz zrestartować serwer roboczy. Napotykam ten sam problem i rozwiązuję go, uruchamiając ponownie.

Wei An
źródło
8
Dzięki! Szkoda, że ​​nie znalazłem tego godzinę temu
Nexus,
2
To naprawiło to dla mnie. Jeśli używasz skryptów selera, pracownik importuje moduły zadań podczas uruchamiania. Nawet jeśli następnie utworzysz więcej funkcji zadań lub zmienisz istniejące, pracownik będzie używał swoich kopii przechowywanych w pamięci tak, jak wtedy, gdy je czytał.
Mark
2
Uwaga: możesz sprawdzić, czy Twoje zadania są zarejestrowane, czy nie, uruchamiająccelery inspect registered
Nick Brady
1
Możesz także uruchomić selera z opcją, --autoreloadktóra uruchomi selera po każdej zmianie kodu.
Sergey Lyapustin
Niestety przestarzałe. Można by skorzystać z rozwiązania z tego linku: avilpage.com/2017/05/…
Tomasz Szkudlarek
51

Miałem ten sam problem: Przyczyną "Received unregistered task of type.."było to, że serwis selera nie znalazł i nie zarejestrował zadań przy uruchomieniu usługi (przy okazji ich lista jest widoczna po uruchomieniu ./manage.py celeryd --loglevel=info).

Zadania te należy zadeklarować w CELERY_IMPORTS = ("tasks", )pliku ustawień.
Jeśli masz specjalny celery_settings.pyplik, musi on zostać zadeklarowany na starcie usługi seler, tak --settings=celery_settings.pyjak napisał digivampire.

igolkotek
źródło
1
Dzięki, faktycznie miałem problem, ponieważ zacząłem selera używając ~ / path / to / selery / seleryd zamiast używać polecenia manage.py!
Antoine,
29

Niezależnie od tego, czy używasz, CELERY_IMPORTSczy autodiscover_tasks, ważne jest, aby zadania można było znaleźć, a nazwa zadań zarejestrowanych w Selerze powinna odpowiadać nazwom, które pracownicy próbują pobrać.

Powiedzmy celery worker -A project --loglevel=DEBUG, że po uruchomieniu selera powinieneś zobaczyć nazwy zadań. Na przykład, jeśli mam debug_taskzadanie w moim celery.py.

[tasks]
. project.celery.debug_task
. celery.backend_cleanup
. celery.chain
. celery.chord
. celery.chord_unlock
. celery.chunks
. celery.group
. celery.map
. celery.starmap

Jeśli nie możesz zobaczyć swoje zadania na liście, proszę sprawdzić seler importu konfiguracji zadań prawidłowo, zarówno w --setting, --config, celeryconfiglub config_from_object.

Jeśli używasz rytmu selera, upewnij się, że nazwa zadania,, taskktórego używasz w, CELERYBEAT_SCHEDULEodpowiada nazwie na liście zadań selera.

Shih-Wen Su
źródło
To było bardzo pomocne. Nazwa zadania musi pasować do klucza „zadania” w Twoim CELERYBEAT_SCHEDULE
ss_millionaire
* Ważną kwestią jest to, że zadania można znaleźć, a nazwa zadań zarejestrowanych w programie Seler powinna być zgodna z nazwami, które pracownicy próbują pobrać. * Słuszna uwaga!!!
Światło. G
To jest poprawna odpowiedź. Nazwa twojego zadania w BEAT_SCHEDULER powinna pasować do tego, co pojawia się na liście automatycznie odkrytych zadań. Więc jeśli użyłeś, @task(name='check_periodically')to powinno pasować do tego, co umieściłeś w harmonogramie CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
bitów
17

Ja też miałem ten sam problem; dodałem

CELERY_IMPORTS=("mytasks")

w moim celeryconfig.pypliku, aby go rozwiązać.

Rohitashv Singhal
źródło
7
Zauważ, że powinna to być lista lub krotka:CELERY_IMPORTS = ['my_module']
asksol
Zrobiło
13
app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])

please include = ['proj.tasks'] Musisz przejść do pierwszego katalogu, a następnie wykonać to

celery -A app.celery_module.celeryapp worker --loglevel=info

nie

celery -A celeryapp worker --loglevel=info

w Twoim celeryconfig.py input Import = ("path.ptah.tasks",)

proszę w innym module wywołać zadanie !!!!!!!!

hejue
źródło
1
Parametr includenależy dodać, jeśli używasz importu względnego. Rozwiązałem swój problem, dodając go
CK.Nguyen
1
Zagłosowano Twoją odpowiedź na ten ciąg please in other module invoke task!!!!!!!!. Pomogło.
VolArt
8

Użycie --settings nie działało dla mnie. Musiałem użyć następujących elementów, aby wszystko działało:

celery --config=celeryconfig --loglevel=INFO

Oto plik celeryconfig, do którego dodano CELERY_IMPORTS:

# Celery configuration file
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'America/Los_Angeles'
CELERY_ENABLE_UTC = True

CELERY_IMPORTS = ("tasks",)

Moja konfiguracja była trochę bardziej skomplikowana, ponieważ używam nadzorcy do uruchomienia selera jako demona.

Jarie Bolander
źródło
8

Dla mnie ten błąd został rozwiązany poprzez zapewnienie, że aplikacja zawierająca zadania została uwzględniona w ustawieniach INSTALLED_APPS django.

samochody
źródło
Ponadto zadania musiały być dostępne z <app> /tasks.py
np8
3

Miałem ten problem w tajemniczych okolicznościach, kiedy dodałem obsługę sygnału do mojej aplikacji django. W ten sposób przekonwertowałem aplikację tak, aby korzystała z AppConfig, co oznacza, że ​​zamiast po prostu czytać jako 'booking„w” INSTALLED_APPS, czyta 'booking.app.BookingConfig'.

Seler nie rozumie, co to znaczy, więc dodałem INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)do moich ustawień django i zmodyfikowałem plik celery.pyfrom

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

do

app.autodiscover_tasks(
    lambda: settings.INSTALLED_APPS + settings.INSTALLED_APPS_WITH_APPCONFIGS
)
Adam Barnes
źródło
3

W moim przypadku zadziałało dodanie wyraźnej nazwy do dekoratora zadań z selera. Zmieniłem deklarację zadania z @app.tasksna@app.tasks(name='module.submodule.task')

Oto przykład

# test_task.py
@celery.task
def test_task():
    print("Celery Task  !!!!")

# test_task.py
@celery.task(name='tasks.test.test_task')
def test_task():
    print("Celery Task  !!!!")
Łukasz Dynowski
źródło
2

Miałem ten sam problem z wykonywaniem zadań z Celery Beat. Seler nie lubi importów względnych, więc w moim celeryconfig.pymusiałem jawnie ustawić pełną nazwę pakietu:

app.conf.beat_schedule = {
   'add-every-30-seconds': {
        'task': 'full.path.to.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}
Justin Regele
źródło
Chciałbym, żeby doktorzy selera mieli więcej przykładów z pełnymi nazwami pakietów. Po zobaczeniu full.path.to.add w tej odpowiedzi stwierdziłem, że nie potrzebuję importu. Wiedziałem, że rozwiązanie jest proste i po prostu potrzebowałem lepszego przykładu app.conf.beat_schedule.
zerocog
2

O dziwo, może to być również spowodowane brakującym pakietem. Uruchom pip, aby zainstalować wszystkie niezbędne pakiety: pip install -r requirements.txt

autodiscover_tasks nie odbierał zadań korzystających z brakujących pakietów.

kakoma
źródło
1
Miałem podobny problem. Myślę, że to, co się dzieje, jest wyjątkiem podczas importu, co powoduje, że części automatycznego wykrywania nie są zakończone.
Tim Tisdall
Ach tak, ma sens. Dzięki
kakoma
1

Nie miałem żadnego problemu z Django . Ale napotkałem to, gdy używałem Flaska . Rozwiązaniem było ustawienie opcji config.

celery worker -A app.celery --loglevel=DEBUG --config=settings

będąc z Django, właśnie miałem:

python manage.py celery worker -c 2 --loglevel=info

Nihal Sharma
źródło
1

Napotkałem również ten problem, ale to nie to samo, więc po prostu FYI. Ostatnie aktualizacje powodują ten komunikat o błędzie z powodu tej składni dekoratora.

ERROR/MainProcess] Received unregistered task of type 'my_server_check'.

@task('my_server_check')

Musiał zostać zmieniony na sprawiedliwy

@task()

Nie mam pojęcia, dlaczego.

Stonefury
źródło
1

Jeśli używasz konfiguracji aplikacji w zainstalowanych aplikacjach, takich jak ta:

LOCAL_APPS = [
'apps.myapp.apps.MyAppConfig']

Następnie w aplikacji konfiguracyjnej zaimportuj zadanie w gotowej metodzie w następujący sposób:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'apps.myapp'

    def ready(self):
        try:
            import apps.myapp.signals  # noqa F401
            import apps.myapp.tasks
        except ImportError:
            pass
Gourav Chawla
źródło
1

Spróbuj zaimportować zadanie Celery do powłoki Pythona - Celery może po cichu nie rejestrować zadań z powodu złej instrukcji importu.

Miałem ImportError wyjątek w moim tasks.py pliku, który był przyczyną Seler aby nie rejestrować zadania w module. Wszystkie inne zadania modułu zostały poprawnie zarejestrowane.

Ten błąd nie był widoczny, dopóki nie spróbowałem zaimportować zadania Celery w powłoce Pythona. Naprawiłem błędną instrukcję importu, a następnie zadania zostały pomyślnie zarejestrowane.

Santos Solorzano
źródło
To też był mój przypadek. Brakuje importu. Problem w tym, że seler po prostu cicho zawodzi.
Redgren Grumbholdt
0

Jeśli napotkasz tego rodzaju błąd, istnieje wiele możliwych przyczyn, ale rozwiązaniem, które znalazłem, było to, że mój plik konfiguracyjny celeryd w / etc / defaults / celeryd został skonfigurowany do standardowego użytku, a nie dla mojego konkretnego projektu django. Jak tylko przekonwertowałem go do formatu określonego w dokumentacji selera , wszystko było w porządku.

tufelkinder
źródło
0

Rozwiązanie dla mnie dodanie tej linii do / etc / default / celeryd

CELERYD_OPTS="-A tasks"

Ponieważ kiedy uruchamiam te polecenia:

celery worker --loglevel=INFO
celery worker -A tasks --loglevel=INFO

Tylko ta ostatnia komenda w ogóle pokazywała nazwy zadań.

Próbowałem również dodać linię CELERY_APP / etc / default / seleryd, ale to też nie zadziałało.

CELERY_APP="tasks"
fatihpense
źródło
0

Miałem problem z klasami PeriodicTask w django-seler, podczas gdy ich nazwy pojawiały się dobrze podczas uruchamiania pracownika selera przy każdym uruchomieniu:

KeyError: u'my_app.tasks.run '

Moim zadaniem była klasa o nazwie „CleanUp”, a nie tylko metoda o nazwie „run”.

Kiedy sprawdziłem tabelę „djcelery_periodictask”, zobaczyłem nieaktualne wpisy i usunięcie ich rozwiązało problem.

djangonaut
źródło
0

Wystarczy dodać moje dwa centy do mojej sprawy z tym błędem ...

Moja ścieżka jest /vagrant/devops/testz nią app.pyi __init__.pyw niej.

Po uruchomieniu cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=infopojawia się ten błąd.

Ale kiedy go uruchamiam, cd /vagrant/devops/test && celery worker -A app.celery --loglevel=infowszystko jest w porządku.

Kostas Demiris
źródło
0

Odkryłem, że jeden z naszych programistów dodał następujący wiersz do jednego z importów:

os.chdir(<path_to_a_local_folder>)

Spowodowało to, że pracownik Selera zmienił swój katalog roboczy z domyślnego katalogu roboczego projektów (w którym mógł znaleźć zadania) do innego katalogu (w którym nie mógł znaleźć zadań).

Po usunięciu tej linii kodu wszystkie zadania zostały znalezione i zarejestrowane.

Amit Zitzman
źródło
0

Seler nie obsługuje importu względnego, więc w moim celeryconfig.py potrzebujesz importu absolutnego.

CELERYBEAT_SCHEDULE = {
        'add_num': {
            'task': 'app.tasks.add_num.add_nums',
            'schedule': timedelta(seconds=10),
            'args': (1, 2)
        }
}
Eds_k
źródło
0

Dodatkowa pozycja do naprawdę przydatnej listy.

Uważam, że Seler jest bezlitosny w odniesieniu do błędów w zadaniach (a przynajmniej nie byłem w stanie prześledzić odpowiednich wpisów w dzienniku) i nie rejestruje ich. Miałem wiele problemów z uruchomieniem Selery jako usługi, które były głównie związane z uprawnieniami.

Najnowsze związane z uprawnieniami zapisu do pliku dziennika. Nie miałem żadnych problemów z programowaniem ani uruchamianiem selera w wierszu poleceń, ale usługa zgłosiła zadanie jako niezarejestrowane.

Musiałem zmienić uprawnienia do folderu dziennika, aby umożliwić usłudze zapis do niego.

MurrayAusUK
źródło
0

Moje 2 centy

Otrzymałem to w obrazie dockera używającym alpine. Ustawienia django, do których odwołuje się /dev/loglogowanie do syslog. Aplikacja django i pracownik selera były oparte na tym samym obrazie. Punkt wejścia obrazu aplikacji django był uruchamiany syslogdna starcie, ale punkt dla pracownika selera nie. To powodowało, że rzeczy takie jak ./manage.py shellniepowodzenie, ponieważ nie było /dev/log. Pracownik selera nie zawiódł. Zamiast tego po cichu ignorował resztę uruchamiania aplikacji, która obejmowała ładowanie shared_taskwpisów z aplikacji w projekcie django

shadi
źródło
0

W moim przypadku błąd polegał na tym, że jeden kontener utworzył pliki w folderze, które zostały zamontowane w systemie plików hosta za pomocą docker-compose.

Musiałem tylko usunąć pliki utworzone przez kontener w systemie hosta i mogłem ponownie uruchomić projekt.

sudo rm -Rf nazwa folderu

(Musiałem użyć sudo, ponieważ pliki były własnością użytkownika root)

Wersja Dockera: 18.03.1

jjacobi
źródło
0

Jeśli używasz autodiscover_tasks, upewnij się, że jesteś functionszarejestrowany tasks.py, a nie inny plik. Lub seler nie może znaleźć tego, functionsktóry chcesz zarejestrować.

Użycie app.register_taskrównież spełni swoje zadanie, ale wydaje się trochę naiwne.

Zapoznaj się z oficjalną specyfikacją autodiscover_tasks.

def autodiscover_tasks(self, packages=None, related_name='tasks', force=False):
    """Auto-discover task modules.

    Searches a list of packages for a "tasks.py" module (or use
    related_name argument).

    If the name is empty, this will be delegated to fix-ups (e.g., Django).

    For example if you have a directory layout like this:

    .. code-block:: text

        foo/__init__.py
           tasks.py
           models.py

        bar/__init__.py
            tasks.py
            models.py

        baz/__init__.py
            models.py

    Then calling ``app.autodiscover_tasks(['foo', bar', 'baz'])`` will
    result in the modules ``foo.tasks`` and ``bar.tasks`` being imported.

    Arguments:
        packages (List[str]): List of packages to search.
            This argument may also be a callable, in which case the
            value returned is used (for lazy evaluation).
        related_name (str): The name of the module to find.  Defaults
            to "tasks": meaning "look for 'module.tasks' for every
            module in ``packages``."
        force (bool): By default this call is lazy so that the actual
            auto-discovery won't happen until an application imports
            the default modules.  Forcing will cause the auto-discovery
            to happen immediately.
    """
W.Perrin
źródło
0

Wpisz poprawną ścieżkę do zadań pliku

app.conf.beat_schedule = {
'send-task': {
    'task': 'appdir.tasks.testapp',
    'schedule': crontab(minute='*/5'),  
},

}

Kairat Koibagarov
źródło
0

podczas uruchamiania selera z poleceniem "seler -A conf worker -l info" wszystkie zadania były wyświetlane w dzienniku, tak jak miałem. conf.celery.debug_task Otrzymałem błąd, ponieważ nie podawałem dokładnej ścieżki zadania. Więc uprzejmie sprawdź to ponownie, kopiując i wklejając dokładny identyfikator zadania.

Chaudhary Naqash Subtain
źródło
0
app = Celery(__name__, broker=app.config['CELERY_BROKER'], 
backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])
张春吉
źródło
0

W odpowiedzi na Twój problem leży w pierwszym wierszu wyjścia podany w pytaniu: /usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python. "is available to Python." % (configname, ))). Bez odpowiedniej konfiguracji Seler nie jest w stanie nic zrobić.

Powodem, dla którego nie może znaleźć selektora jest najprawdopodobniej nie ma go w PYTHONPATH.

DejanLekic
źródło