sourcetip

셀러리가 유형(실행 예제)의 등록되지 않은 작업을 받았습니다.

fileupload 2023. 7. 17. 21:21
반응형

셀러리가 유형(실행 예제)의 등록되지 않은 작업을 받았습니다.

셀러리 문서의 예제를 실행하려고 합니다.

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())

셀러리 구성 폴더에 있습니다.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

셀러리 서버의 오류

[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'

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

작업자 서버를 다시 시작해야 할 것 같습니다.저는 같은 문제를 만나서 다시 시작함으로써 해결합니다.

저도 같은 문제가 있었습니다.:"Received unregistered task of type.." 시작 시할 때 됩니다)../manage.py celeryd --loglevel=info).

은 한작업선합야니다언해에 .CELERY_IMPORTS = ("tasks", )설정 파일에 있습니다.
당신이 특별한 것을 가지고 있다면.celery_settings.py 서비스 시 일파셀서비시작시다음같합선니언다야해이과스로 .--settings=celery_settings.py디지바파이어가 쓴 것처럼.

은 서에현태볼에서 할 수 .celery.registry.TaskRegistryclass. 구성 디렉터리이 클스에 수 . 셀러리 구성(현재 디렉터리)이 다음에 없을 수 있습니다.PYTHONPATH셀러리가 찾지 못하고 기본값으로 돌아갑니다.셀러리를 시작할 때 명시적으로 지정하기만 하면 됩니다.

celeryd --loglevel=INFO --settings=celeryconfig

설정할 수도 있습니다.--loglevel=DEBUG문제를 즉시 확인해야 할 것입니다.

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

=['proj.dll']을(를) 포함하십시오. 맨 위 디렉터리로 이동한 다음 이를 실행하십시오.

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

것은 아니다.

celery -A celeryapp worker --loglevel=info

celeryconfig.py 에서 =("path.path.dll")를 입력합니다.

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

를 사용하는지 CELERY_IMPORTS또는autodiscover_tasks중요한 점은 작업을 찾을 수 있고 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셀러리 태스크 목록의 이름과 일치합니다.

저도 같은 문제가 있었습니다; 저는 덧붙였습니다.

CELERY_IMPORTS=("mytasks")

내 안에서celeryconfig.py파일을 사용하여 해결합니다.

--설정을 사용하는 것은 저에게 적합하지 않습니다.모든 작업을 수행하기 위해 다음을 사용해야 했습니다.

celery --config=celeryconfig --loglevel=INFO

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

셀러리를 데몬으로 시작하기 위해 슈퍼바이저를 사용하고 있기 때문에 설정이 조금 더 까다로웠습니다.

제게 효과가 있었던 것은 셀러리 작업 장식가에 명시적인 이름을 추가하는 것이었습니다.는 업무 을 작업선에변습다니했경서을언다▁my니▁from▁declaration에서 변경했습니다.@app.tasks@app.tasks(name='module.submodule.task')

여기 예가 있습니다.

처음에 제 업무는 다음과 같았습니다.

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

다음으로 변경했습니다.

# tasks/test_tasks.py
@celery.task(name='tasks.test_tasks.test_task')
def test_task():
    print("Celery Task  !!!!")

이 방법은 셀러리 구성에 포함할 전용 tasks.py 파일이 없을 때 유용합니다.

이 오류는 django의 INSTALLED_APPS 설정에 작업이 포함된 앱이 포함되어 있는지 확인함으로써 해결되었습니다.

, 제가 진행되지 점이였습니다.autodiscover_tasks적절히.

celery.py코드를 파일로 저장합니다.autodiscover_tasks다음과 같습니다.

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

다음과 같은 것으로 변경했습니다.

from django.apps import apps
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])

행운을 빕니다.

제가 장고 앱에 신호 처리를 추가했을 때 이 문제가 이상하게 발생했습니다.그렇게 함으로써 저는 앱을 앱 구성을 사용하도록 변환했습니다. 즉, 단순히 다음과 같이 읽는 대신'bookingINSTALLED_APPS그것은 읽었습니다.'booking.app.BookingConfig'.

셀러리는 그 말이 무슨 뜻인지 이해하지 못해서, 나는 덧붙였습니다.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
)

저도 셀러리 비트에서 작업을 실행하는 데 동일한 문제가 있었습니다.셀러리는 상대적인 수입품을 좋아하지 않기 때문에 내 안에 있습니다.celeryconfig.py전체 패키지 이름을 명시적으로 설정해야 했습니다.

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

Python Shell에서 Celery 태스크를 가져오십시오. 잘못된 가져오기 문 때문에 Celery가 자동으로 태스크를 등록하지 못할 수 있습니다.

는 는나가 요.ImportError셀러리가 모듈에 작업을 등록하지 못하게 만든 예외가 내 tasks.py 파일에 있습니다.다른 모든 모듈 작업이 올바르게 등록되었습니다.

이 오류는 Python Shell 내에서 Celery 작업을 가져오기 전까지는 분명하지 않았습니다.잘못된 수입 명세서를 수정한 후 작업이 성공적으로 등록되었습니다.

이것은 이상하게도 누락된 패키지 때문일 수도 있습니다. 패키지를 합니다. pip 실 행 필 설 합 니 치 다 를 지 패 키 을pip install -r requirements.txt

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

저는 장고와 아무런 문제가 없었습니다.플라스크를 사용할 때 이런 일을 겪었습니다.솔루션이 구성 옵션을 설정하는 중이었습니다.

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

장고와 함께 있는 동안, 저는 그냥 다음과 같이 했습니다.

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

나도 이 문제에 부딪혔지만, 완전히 같지는 않아서 참고로.최근 업그레이드로 인해 이 데코레이터 구문으로 인해 이 오류 메시지가 발생합니다.

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

@task('my_server_check')

그냥 변경해야 했습니다.

@task()

왜 그런지 모르겠어요.

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

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

tasks.py 파일을 포함하셨습니까? 아니면 비동기식 방법이 저장된 곳을 포함하셨습니까?

app = Celery('APP_NAME', broker='redis://redis:6379/0', include=['app1.tasks', 'app2.tasks', ...])

했습니다. 때가 'celery_task라는 이름의. 명령어를 하면 'celery_task'가 실행됩니다.celery worker -A celery_task.task --loglevel=info가 있습니다그건 효과가 있다.

일부 다른 답변에서 이미 지적했듯이, 셀러리가 종속성 문제뿐만 아니라 구문 또는 코드 문제를 포함하여 작업을 묵묵히 무시하는 많은 이유가 있습니다.

빠른 방법 중 하나는 실행하는 것입니다.

./manage.py check

보고된 오류를 수정한 후 셀러리에서 태스크를 인식하는 경우가 많습니다.

@ 여기서 말한 것처럼 도커를 사용하면 고통이 사라질 것입니다.

docker stop $(docker ps -a -q)

저는 브로커(레디스)를 다시 시작해 해결했습니다.


작업이 이미 셀러리의 작업 목록에 올바르게 표시되었으며 모든 관련된 장고 설정 및 가져오기가 정상적으로 작동했습니다.

제가 작업을 작성하기 전에 브로커가 실행 중이었고, 셀러리와 장고를 다시 시작하는 것만으로는 해결되지 않았습니다.

Ctrl+한 후 Ctrl+C로 하면 Redis가 실행됩니다.redis-serverCelery가 작업을 정확하게 식별하는 데 도움이 되었습니다.

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

이 줄을 /etc/default/celeryd에 추가할 수 있는 솔루션

CELERYD_OPTS="-A tasks"

왜냐하면 다음 명령을 실행할 때:

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

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

CELERY_APP line /etc/default/celeryd도 추가해봤지만 역시 실패했습니다.

CELERY_APP="tasks"

저는 장고 셀러리의 정기 작업 클래스에 문제가 있었지만, 모든 실행이 트리거될 때 셀러리 워커를 시작할 때 그들의 이름이 잘 표시되었습니다.

키 오류: u'my_app.tasks.run'

저의 과제는 단순히 '실행'이라는 방법이 아닌 '청소'라는 이름의 수업이었습니다.

'djcelery_periodic task' 테이블을 확인했을 때 오래된 항목을 확인하고 삭제하여 문제를 해결했습니다.

이 오류에 대한 제 의견을 덧붙이자면...

길은 나의길입니다./vagrant/devops/test와 함께app.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모든 것이 괜찮습니다.

우리 프로그래머 중 한 명이 가져오기 중 하나에 다음 행을 추가했습니다.

os.chdir(<path_to_a_local_folder>)

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

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

셀러리는 상대적인 수입을 지원하지 않기 때문에 제 celeryconfig.py 에서는 절대적인 수입이 필요합니다.

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

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

작업 오류와 관련하여 Celery가 용서할 수 없다는 것을 알게 되었고(또는 적어도 적절한 로그 항목을 추적할 수 없었습니다) 등록되지 않습니다.저는 서비스로서의 셀러리를 실행하는 데 많은 문제가 있었는데, 이는 주로 권한과 관련되어 있었습니다.

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

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

나의 2센트

알파인을 이용해 도커 이미지로 촬영했습니다.이 참조한 django입니다./dev/logsyslog에 로깅할 수 있습니다.장고 앱과 샐러리맨은 둘 다 같은 이미지를 기반으로 했습니다.django 앱 이미지의 시작점이 시작되었습니다.syslogd시작할 때, 하지만 샐러리맨을 위한 것은 아니었습니다.이것은 다음과 같은 것들을 야기했습니다../manage.py shell 것이기 때문에 실패하는 것/dev/log샐러리맨은 실패하지 않았습니다.대신 로드를 포함한 나머지 앱 실행을 묵묵히 무시했습니다.shared_task의 응용 합니다.

언급URL : https://stackoverflow.com/questions/9769496/celery-received-unregistered-task-of-type-run-example

반응형