셀러리 수신 미등록 작업 유형 (예제 실행)


96

Celery 문서에서 예제 를 실행하려고합니다 .

난 달린다: 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())

동일한 폴더 celeryconfig.py에서 :

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

"run_task.py"를 실행할 때 :

파이썬 콘솔에서

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

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'

무엇이 문제인지 설명해주세요.


12
안녕하세요. 문제가 무엇이며 어떻게 해결했는지 알려주시겠습니까? 받아 들여진 대답은 다른 사람들이이 문제를 어떻게 해결할 수 있는지 명확하지 않습니다. 감사.
Jordan Reiter

3
저는 Jordan과 함께 있습니다. 이것은 전혀 유용하지 않았습니다. 비추천.
Jay Taylor

2
aiho의 대답은 정답입니다 :CELERY_IMPORTS = ("tasks", )
Alp

답변:


49

celery.registry.TaskRegistry수업 에 등록 된 과제의 현재 목록을 볼 수 있습니다 . celeryconfig (현재 디렉토리에 있음)가 PYTHONPATH없어서 셀러리가 찾을 수없고 기본값으로 돌아갈 수 있습니다. 셀러리를 시작할 때 명시 적으로 지정하기 만하면됩니다.

celeryd --loglevel=INFO --settings=celeryconfig

당신은 또한 설정할 수 있으며 --loglevel=DEBUG아마 즉시 문제를 볼 수 있습니다 .


4
+1 --loglevel=DEBUG, 내 작업에 구문 오류가 있습니다.
Jacob Valenta

12
celeryd는 구식입니다. 이제 하나가 실행되어야 celery worker에 대한 예를 Django다음과 같습니다 :celery --app=your_app.celery worker --loglevel=info
andilabs

나를 위해 (셀러리 3.1.23), celery.registry.tasks현재 모든 작업 목록을 보려면 을 사용해야 했습니다. 를 실행하여 언제든지 확인할 수 있습니다 dir(celery.registry).
Nick Brady

에 대한 --loglevel=DEBUG뿐만 아니라 내 옆에서
쇼비

64

작업자 서버를 다시 시작해야한다고 생각합니다. 나는 같은 문제를 만나고 다시 시작하여 해결합니다.


8
감사! 위시 나는 한 시간 전에이 발견
넥서스

2
이것은 나를 위해 그것을 고쳤습니다. celeryd 스크립트를 사용하는 경우 작업자는 시작시 작업 모듈을 가져옵니다. 그런 다음 더 많은 작업 기능을 생성하거나 기존 기능을 변경하더라도 작업자는 메모리 내 사본을 읽을 때 그대로 사용합니다.
Mark

1
참고 : 당신은 당신의 작업 또는 실행하여 등록되지 않은 것을 확인할 수 있습니다celery inspect registered
닉 브래디

1
--autoreload코드가 변경 될 때마다 셀러리를 다시 시작하는 옵션으로 셀러리를 시작할 수도 있습니다 .
Sergey Lyapustin

불행히도 더 이상 사용되지 않습니다. 다음 링크에서 솔루션을 사용할 수 있습니다 : avilpage.com/2017/05/…
Tomasz Szkudlarek

50

나는 같은 문제가 있었다. "Received unregistered task of type.." celeryd 서비스가 서비스 시작시 작업을 찾아 등록하지 않았기 (시작할 때 목록이 표시됩니다 ./manage.py celeryd --loglevel=info ).

이러한 작업은 CELERY_IMPORTS = ("tasks", )설정 파일에서 선언해야 합니다.
특수 celery_settings.py파일 이있는 경우 --settings=celery_settings.pydigivampire가 작성한 대로 celeryd 서비스 시작시 선언해야합니다 .


1
감사합니다. manage.py 명령을 사용하는 대신 ~ / path / to / celery / celeryd를 사용하여 셀러리를 시작했기 때문에 실제로 문제가 발생했습니다!
Antoine

27

사용 여부 CELERY_IMPORTS또는autodiscover_tasks 중요한 점은 작업을 찾을 수 있고 Celery에 등록 된 작업의 이름이 작업자가 가져 오려는 이름과 일치해야한다는 것입니다.

Celery를 실행 celery worker -A project --loglevel=DEBUG하면 작업 이름이 표시되어야합니다. 예를 들어, 나는이 있으면 debug_task내에서 작업을 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

당신이 목록에서 작업을 볼 수없는 경우, 셀러리 구성 수입을 확인하시기 바랍니다 작업을 올바르게, 하나의 --setting, --config, celeryconfig또는config_from_object .

당신이 셀러리 비트를 사용하는 경우, 확인 작업 이름을 확인 task, 당신은에 사용 CELERYBEAT_SCHEDULE셀러리 작업 목록에서 일치하는 이름을.


이것은 매우 도움이되었습니다. 작업 이름은 CELERYBEAT_SCHEDULE의 '작업'키와 일치해야합니다.
ss_millionaire

* 중요한 점은 작업을 찾을 수 있고 셀러리에 등록 된 작업의 이름이 작업자가 가져 오려는 이름과 일치해야한다는 것입니다. * 좋은 지적!!!
Light.G 19

이것이 정답입니다. BEAT_SCHEDULER의 작업 이름은 자동 검색된 작업 목록에 표시된 것과 일치해야합니다. 따라서 사용한 경우 @task(name='check_periodically')비트 일정에 넣은 것과 일치해야합니다. IE :CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
Mormoran

16

나도 같은 문제가 있었다. 나는 추가했다

CELERY_IMPORTS=("mytasks")

celeryconfig.py그것을 해결하기 위해 내 파일에.


6
이것은 목록 또는 튜플이어야합니다.CELERY_IMPORTS = ['my_module']
asksol

이것은 나를 위해 해냈습니다
Riziero

12
app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])

include = [ 'proj.tasks'] 당신은 최상위 디렉토리로 가서 이것을 실행해야합니다.

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

아니

celery -A celeryapp worker --loglevel=info

celeryconfig.py 입력에서 imports = ( "path.ptah.tasks",)

다른 모듈에서 작업을 호출하십시오 !!!!!!!!


1
include당신이 상대의 수입을 사용하는 경우 PARAM 필요가 추가 될 수 있습니다. 나는 그것을 추가하여 내 문제를 해결했습니다
CK.Nguyen

1
이 문자열에 대한 답변에 투표했습니다 please in other module invoke task!!!!!!!!. 도움이되었습니다.
VolArt

8

--settings를 사용하면 효과가 없었습니다. 모든 것이 작동하도록하려면 다음을 사용해야했습니다.

celery --config=celeryconfig --loglevel=INFO

다음은 CELERY_IMPORTS가 추가 된 celeryconfig 파일입니다.

# 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",)

감독자를 사용하여 셀러리를 데몬으로 시작하기 때문에 설정이 조금 더 까다로 웠습니다.


8

나를 위해이 오류는 작업이 포함 된 앱이 django의 INSTALLED_APPS 설정에 포함되어 있는지 확인하여 해결되었습니다.


또한 작업은 <app> /tasks.py에서 액세스 할 수 있어야했습니다
np8

3

django 앱에 신호 처리를 추가했을 때이 문제가 이상하게 발생했습니다. 그렇게 내가 대신 단순히 읽는 것을 의미 appconfig가를 사용하는 응용 프로그램을 변환 'booking에 ' INSTALLED_APPS, 그것을 읽고'booking.app.BookingConfig' .

Celery는 그것이 의미하는 바를 이해하지 못하기 때문에 INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)django 설정에 추가 celery.py하고

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

app.autodiscover_tasks(
    lambda: settings.INSTALLED_APPS + settings.INSTALLED_APPS_WITH_APPCONFIGS
)

3

나를 위해 일한 것은 셀러리 작업 데코레이터에 명시적인 이름을 추가하는 것이 었습니다. 작업 선언을에서 @app.tasks로 변경 했습니다.@app.tasks(name='module.submodule.task')

다음은 예입니다.

# 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  !!!!")

2

Celery Beat에서 작업을 실행하는 데 동일한 문제가 발생했습니다. 셀러리는 상대 수입품을 좋아하지 않으므로에서 celeryconfig.py전체 패키지 이름을 명시 적으로 설정해야했습니다.

app.conf.beat_schedule = {
   'add-every-30-seconds': {
        'task': 'full.path.to.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}

셀러리 문서에 전체 패키지 이름이 포함 된 더 많은 예제가 있었으면합니다. 이 답변에서 full.path.to.add를 본 후 가져 오기가 필요하지 않다는 것을 알았습니다. 솔루션이 간단하다는 것을 알고 app.conf.beat_schedule의 더 나은 예제가 필요했습니다.
zerocog

2

이상하게도 패키지 누락으로 인한 것일 수도 있습니다. pip를 실행하여 필요한 모든 패키지를 설치합니다. pip install -r requirements.txt

autodiscover_tasks 누락 된 패키지를 사용한 작업을 선택하지 않았습니다.


1
비슷한 문제가있었습니다. 가져 오는 동안 예외가 발생하면 자동 검색의 일부가 완료되지 않는 것 같습니다.
Tim Tisdall

아, 맞아요. 감사합니다
kakoma dec

1

나는 Django에 아무런 문제가 없었습니다 . 하지만 내가 Flask 를 사용할 때 이것을 만났습니다 . 해결책은 구성 옵션을 설정하는 것이 었습니다.

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

Django를 사용하는 동안 방금 다음을 수행했습니다.

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


1

이 문제도 발생했지만 동일하지는 않으므로 참고하십시오. 최근 업그레이드는이 데코레이터 구문으로 인해이 오류 메시지를 발생시킵니다.

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

@task('my_server_check')

그냥 변경해야 했어

@task()

이유가 전혀 없습니다.


1

다음과 같이 설치된 앱에서 앱 구성을 사용하는 경우 :

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

그런 다음 구성 앱에서 다음과 같은 준비 방법으로 작업을 가져옵니다.

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

0

이런 종류의 오류가 발생하는 경우 가능한 원인이 여러 가지 있지만 내가 찾은 해결책은 / etc / defaults / celeryd의 celeryd 구성 파일이 특정 django 프로젝트가 아닌 표준 용도로 구성되었다는 것입니다. 셀러리 문서에 지정된 형식으로 변환하자마자 모든 것이 잘되었습니다.


0

이 줄을 / etc / default / celeryd에 추가하는 솔루션

CELERYD_OPTS="-A tasks"

이 명령을 실행할 때 :

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

후자의 명령 만 작업 이름을 표시했습니다.

CELERY_APP 줄 / etc / default / celeryd를 추가하려고 시도했지만 작동하지 않았습니다.

CELERY_APP="tasks"

0

django-celery의 PeriodicTask 클래스에 문제가 있었지만 실행이 트리거 될 때마다 셀러리 작업자를 시작할 때 이름이 제대로 표시되었습니다.

KeyError : u'my_app.tasks.run '

내 작업은 'run'이라는 메서드가 아니라 'CleanUp'이라는 클래스였습니다.

'djcelery_periodictask'테이블을 확인했을 때 오래된 항목을보고 삭제하면 문제가 해결되었습니다.


0

이 오류로 내 경우에 2 센트를 추가하기 위해 ...

내 경로는 /vagrant/devops/testapp.py__init__.py 그 안에.

내가 달릴 때 cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=info 때이 오류가 발생합니다.

하지만 cd /vagrant/devops/test && celery worker -A app.celery --loglevel=info모든 것이 괜찮은 것처럼 실행하면 .


0

프로그래머 중 한 명이 가져 오기 중 하나에 다음 줄을 추가 한 것을 발견했습니다.

os.chdir(<path_to_a_local_folder>)

이로 인해 Celery 작업자가 작업 디렉토리를 프로젝트의 기본 작업 디렉토리 (작업을 찾을 수있는 위치)에서 다른 디렉토리 (작업을 찾을 수없는 위치)로 변경했습니다.

이 코드 줄을 제거한 후 모든 작업을 찾아 등록했습니다.


0

Celery는 상대 가져 오기를 지원하지 않으므로 내 celeryconfig.py에서 절대 가져 오기가 필요합니다.

CELERYBEAT_SCHEDULE = {
        'add_num': {
            'task': 'app.tasks.add_num.add_nums',
            'schedule': timedelta(seconds=10),
            'args': (1, 2)
        }
}

0

정말 유용한 목록에 대한 추가 항목입니다.

나는 Celery가 작업 오류와 관련하여 용서하지 않는다는 것을 발견했으며 (또는 적어도 적절한 로그 항목을 추적 할 수 없었습니다) 등록하지 않았습니다. 나는 주로 권한과 관련된 Celery를 서비스로 실행하는 데 많은 문제가 있습니다.

로그 파일에 쓰는 권한과 관련된 최신 정보입니다. 명령 줄에서 셀러리를 개발하거나 실행하는 데 문제가 없었지만 서비스가 작업을 등록되지 않은 것으로보고했습니다.

서비스에서 쓸 수 있도록 로그 폴더 권한을 변경해야했습니다.


0

내 2 센트

나는 알파인을 사용하여 도커 이미지로 이것을 얻었습니다. /dev/logsyslog에 로깅하기 위해 참조 된 django 설정 . 장고 앱과 셀러리 워커는 모두 동일한 이미지를 기반으로했습니다. 장고 앱 이미지의 진입 점은 syslogd시작할 때 시작되었지만 셀러리 작업자 의 진입 점 은 그렇지 않았습니다. 이 일을 좋아하는 원인이되었다 ./manage.py shell어떤이되지 않을 것 때문에 실패 /dev/log. 셀러리 일꾼은 실패하지 않았습니다. 대신 shared_taskdjango 프로젝트의 애플리케이션에서 항목을 로드하는 것을 포함하여 나머지 앱 시작을 조용히 무시했습니다.


0

제 경우 오류는 하나의 컨테이너가 docker-compose로 호스트 파일 시스템에 마운트 된 폴더에 파일을 생성했기 때문입니다.

호스트 시스템에서 컨테이너가 생성 한 파일을 제거하기 만하면 프로젝트를 다시 시작할 수있었습니다.

sudo rm -Rf 폴더 이름

(파일은 루트 사용자가 소유했기 때문에 sudo를 사용해야했습니다)

Docker 버전 : 18.03.1


0

을 사용 하는 경우 등록 할 파일이 다른 파일이 아닌에 남아 autodiscover_tasks있는지 확인하십시오 . 또는 셀러리는 찾을 수 없습니다functionstasks.pyfunctions 등록하고자하는 .

사용하다 app.register_task 도 효과가 있지만 약간 순진 해 보입니다.

의 공식 사양을 참조하십시오 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.
    """

0

파일 작업에 대한 올바른 경로를 작성하십시오.

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

}


0

"celery -A conf worker -l info"명령으로 셀러리를 실행할 때 모든 작업이 로그에 나열됩니다. conf.celery.debug_task이 정확한 작업 경로를 제공하지 않았기 때문에 오류가 발생했습니다. 따라서 정확한 작업 ID를 복사하여 붙여 넣어 친절하게 다시 확인하십시오.


0
app = Celery(__name__, broker=app.config['CELERY_BROKER'], 
backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])

0

문제에 대한 답은 질문에 제공 한 출력의 첫 번째 줄에 있습니다. /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, ))) . 올바른 구성이 없으면 Celery는 아무것도 할 수 없습니다.

celeryconfig를 찾을 수없는 이유는 PYTHONPATH에 없을 가능성이 큽니다.


0

내 문제를 해결했습니다. 내 '작업'은 'celery_task'라는 파이썬 패키지 아래에 있습니다.이 패키지를 종료하고 명령을 실행합니다 celery worker -A celery_task.task --loglevel=info. 효과가있다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.