Celery Menerima tugas jenis yang tidak terdaftar (contoh jalan)


99

Saya mencoba menjalankan contoh dari dokumentasi Celery.

Saya berlari: 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

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

Di folder yang sama celeryconfig.py:

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

Saat saya menjalankan "run_task.py":

di konsol python

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

kesalahan pada server seledri

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

Tolong jelaskan apa masalahnya.


12
Hai, dapatkah Anda membagikan masalah yang terjadi dan bagaimana Anda mengatasinya? Jawaban yang diterima tidak menjelaskan bagaimana orang lain dapat memecahkan masalah ini. Terima kasih.
Jordan Reiter

3
Saya dengan Jordan- ini tidak berguna sama sekali. Suara negatif.
Jay Taylor

2
jawaban dari aiho adalah yang benar:CELERY_IMPORTS = ("tasks", )
Alp

Jawaban:


50

Anda dapat melihat daftar tugas terdaftar saat ini di celery.registry.TaskRegistrykelas. Mungkin seledri Anda (di direktori saat ini) tidak ada PYTHONPATHsehingga seledri tidak dapat menemukannya dan kembali ke default. Cukup tentukan secara eksplisit saat memulai seledri.

celeryd --loglevel=INFO --settings=celeryconfig

Anda juga dapat mengatur --loglevel=DEBUGdan Anda mungkin akan segera melihat masalahnya.


5
1 untuk --loglevel=DEBUG, ada kesalahan sintaks dalam tugas saya.
Jacob Valenta

15
seledri sudah usang. Sekarang orang harus menjalankan celery workermisalnya untuk Djangoseperti inicelery --app=your_app.celery worker --loglevel=info
andilabs

Bagi saya (seledri 3.1.23), saya harus menggunakan celery.registry.tasksuntuk melihat daftar semua tugas saya saat ini. Anda selalu dapat memeriksa dengan menjalankan dir(celery.registry).
Nick Brady

untuk --loglevel=DEBUGdari sisi saya juga
Shobi

65

Saya pikir Anda perlu memulai ulang server pekerja. Saya menemui masalah yang sama dan menyelesaikannya dengan memulai ulang.


8
Terima kasih! Seandainya saya menemukan ini satu jam yang lalu
Nexus

2
Ini memperbaikinya untuk saya. Jika Anda menggunakan skrip celeryd, pekerja akan mengimpor modul tugas Anda saat startup. Bahkan jika Anda kemudian membuat lebih banyak fungsi tugas atau mengubah yang sudah ada, pekerja akan menggunakan salinan dalam memori seperti saat membacanya.
Tandai

2
Catatan: Anda dapat memverifikasi bahwa tugas Anda terdaftar atau tidak dengan menjalankancelery inspect registered
Nick Brady

1
Anda juga dapat memulai seledri dengan opsi --autoreloadyang akan memulai seledri setiap kali kode diubah.
Sergey Lyapustin

Sayangnya tidak digunakan lagi. Seseorang dapat menggunakan solusi dari tautan ini: avilpage.com/2017/05/…
Tomasz Szkudlarek

51

Saya memiliki masalah yang sama: Alasannya "Received unregistered task of type.."adalah karena layanan seledri tidak menemukan dan mendaftarkan tugas saat layanan dimulai (btw daftarnya terlihat ketika Anda mulai ./manage.py celeryd --loglevel=info).

Tugas ini harus dideklarasikan dalam CELERY_IMPORTS = ("tasks", )file pengaturan.
Jika Anda memiliki celery_settings.pyfile khusus, itu harus dideklarasikan pada layanan seledri mulai seperti yang --settings=celery_settings.pyditulis digivampire.


1
Terima kasih, saya benar-benar mengalami masalah karena saya mulai menggunakan seledri menggunakan ~ / path / to / celery / celeryd daripada menggunakan perintah manage.py!
Antoine

29

Apakah Anda menggunakan CELERY_IMPORTSatau autodiscover_tasks, poin pentingnya adalah tugas dapat ditemukan dan nama tugas yang terdaftar di Celery harus cocok dengan nama yang coba diambil pekerja.

Saat Anda meluncurkan Celery, katakanlah celery worker -A project --loglevel=DEBUG, Anda akan melihat nama tugas. Misalnya, jika saya memiliki debug_tasktugas di file 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

Jika Anda tidak dapat melihat tugas-tugas Anda dalam daftar, silakan cek impor konfigurasi seledri Anda tugas dengan benar, baik dalam --setting, --config, celeryconfigatau config_from_object.

Jika Anda menggunakan irama seledri, pastikan nama tugasnya, task ,, Anda gunakan CELERYBEAT_SCHEDULEsesuai dengan nama di daftar tugas seledri.


Ini sangat membantu. Nama tugas harus cocok dengan kunci 'tugas' di CELERYBEAT_SCHEDULE Anda
ss_millionaire

* Poin pentingnya adalah tugas dapat ditemukan dan nama tugas yang terdaftar di Celery harus cocok dengan nama yang coba diambil oleh pekerja. * Poin bagus !!!
Light.G

Ini jawaban yang benar. Nama tugas Anda di BEAT_SCHEDULER harus cocok dengan apa pun yang muncul di daftar tugas yang ditemukan secara otomatis. Jadi jika Anda menggunakannya @task(name='check_periodically')maka itu harus sesuai dengan apa yang Anda masukkan dalam jadwal ketukan, yaitu:CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
Mormoran

17

Saya juga punya masalah yang sama; saya tambahkan

CELERY_IMPORTS=("mytasks")

di celeryconfig.pyfile saya untuk menyelesaikannya.


7
Perhatikan bahwa ini harus berupa daftar atau tupel:CELERY_IMPORTS = ['my_module']
askol

Ini berhasil untuk saya
Riziero

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

please include = ['proj.tasks'] Anda harus pergi ke direktori teratas, lalu jalankan ini

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

tidak

celery -A celeryapp worker --loglevel=info

di celeryconfig.py input import = ("path.ptah.tasks",)

tolong di modul lain panggil tugas !!!!!!!!


1
The includeparam perlu menjadi add jika Anda menggunakan impor relatif. Saya telah memecahkan masalah saya dengan menambahkannya
CK.Nguyen

1
Telah memilih jawaban Anda untuk string ini please in other module invoke task!!!!!!!!. Itu membantu.
VolArt

8

Menggunakan --setelan tidak berhasil untuk saya. Saya harus menggunakan yang berikut ini agar semuanya berfungsi:

celery --config=celeryconfig --loglevel=INFO

Berikut adalah file celeryconfig yang ditambahkan 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",)

Pengaturan saya sedikit lebih rumit karena saya menggunakan supervisor untuk meluncurkan seledri sebagai daemon.


8

Bagi saya kesalahan ini diselesaikan dengan memastikan aplikasi yang berisi tugas-tugas dimasukkan di bawah pengaturan INSTALLED_APPS django.


Selain itu, tugas harus dapat diakses dari <app> /tasks.py
np8

3

Saya mengalami masalah ini secara misterius ketika saya menambahkan beberapa penanganan sinyal ke aplikasi django saya. Dengan melakukan itu saya mengonversi aplikasi untuk menggunakan AppConfig, yang berarti bahwa alih-alih hanya membaca sebagai 'booking'dalam INSTALLED_APPS, itu dibaca'booking.app.BookingConfig' .

Celery tidak mengerti apa artinya, jadi saya menambahkan, INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)ke pengaturan django saya, dan memodifikasi my celery.pyfrom

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

untuk

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

3

Apa yang berhasil bagi saya, adalah menambahkan nama eksplisit ke dekorator tugas seledri. Saya mengubah pernyataan tugas saya dari @app.tasksmenjadi@app.tasks(name='module.submodule.task')

Berikut ini contohnya

# 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

Saya memiliki masalah yang sama dalam menjalankan tugas dari Celery Beat. Celery tidak suka impor relatif jadi di saya celeryconfig.py, saya harus secara eksplisit mengatur nama paket lengkap:

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

Saya berharap dokumen seledri memiliki lebih banyak contoh dengan nama paket lengkap. Setelah melihat full.path.to.add dalam jawaban ini, saya menemukan bahwa saya tidak membutuhkan impor. Saya tahu solusinya sederhana, dan hanya perlu memiliki contoh app.conf.beat_schedule yang lebih baik.
zerocog

2

Ini, anehnya, bisa juga karena ada paket yang hilang. Jalankan pip untuk menginstal semua paket yang diperlukan: pip install -r requirements.txt

autodiscover_tasks tidak mengambil tugas yang menggunakan paket yang hilang.


1
Saya memiliki masalah serupa. Saya pikir yang terjadi adalah pengecualian selama impor menyebabkan bagian dari penemuan otomatis tidak selesai.
Tim Tisdall

Ahh ya, masuk akal. Terima kasih
kakoma

1

Saya tidak memiliki masalah dengan Django . Tapi menemui ini saat saya menggunakan Flask . Solusinya adalah mengatur opsi konfigurasi.

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

sementara dengan Django, saya baru saja:

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


1

Saya mengalami masalah ini juga, tetapi tidak persis sama, jadi FYI saja. Pembaruan terbaru menyebabkan pesan kesalahan ini karena sintaks penghias ini.

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

@task('my_server_check')

Harus diubah menjadi adil

@task()

Tidak tahu kenapa.


1

Jika Anda menggunakan konfigurasi aplikasi di aplikasi yang diinstal seperti ini:

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

Kemudian di aplikasi konfigurasi Anda, impor tugas dalam metode siap seperti ini:

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

1

Coba impor tugas Celery dengan Python Shell - Celery mungkin diam-diam gagal mendaftarkan tugas Anda karena pernyataan import yang buruk.

Saya punya ImportError pengecualian dalam file tasks.py saya yang menyebabkan Celery tidak mendaftarkan tugas di modul. Semua tugas modul lainnya telah didaftarkan dengan benar.

Kesalahan ini tidak terbukti sampai saya mencoba mengimpor tugas Celery dalam Python Shell. Saya memperbaiki pernyataan impor yang buruk dan kemudian tugas berhasil didaftarkan.


Ini kasus saya juga. Ada impor yang hilang. Masalahnya adalah seledri gagal diam-diam.
Redgren Grumbholdt

0

Jika Anda mengalami kesalahan seperti ini, ada beberapa kemungkinan penyebabnya, tetapi solusi yang saya temukan adalah file konfigurasi seledri saya di / etc / defaults / celeryd telah dikonfigurasi untuk penggunaan standar, bukan untuk proyek django khusus saya. Segera setelah saya mengubahnya ke format yang ditentukan dalam dokumen seledri , semuanya baik-baik saja.


0

Solusi bagi saya untuk menambahkan baris ini ke / etc / default / celeryd

CELERYD_OPTS="-A tasks"

Karena ketika saya menjalankan perintah ini:

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

Hanya perintah terakhir yang menunjukkan nama tugas sama sekali.

Saya juga mencoba menambahkan baris CELERY_APP / etc / default / celeryd tetapi itu juga tidak berhasil.

CELERY_APP="tasks"

0

Saya memiliki masalah dengan kelas PeriodicTask di django-seledri, sementara nama mereka muncul dengan baik saat memulai pekerja seledri setiap eksekusi dipicu:

KeyError: u'my_app.tasks.run '

Tugas saya adalah kelas bernama 'CleanUp', bukan hanya metode yang disebut 'run'.

Ketika saya memeriksa tabel 'djcelery_periodictask' saya melihat entri yang kedaluwarsa dan menghapusnya memperbaiki masalah.


0

Hanya untuk menambahkan dua sen saya untuk kasus saya dengan kesalahan ini ...

Jalan saya /vagrant/devops/testdengan app.pydan __init__.pydi dalamnya.

Ketika saya menjalankan cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=infosaya mendapatkan kesalahan ini.

Tapi ketika saya menjalankannya seperti cd /vagrant/devops/test && celery worker -A app.celery --loglevel=infosemuanya baik-baik saja.


0

Saya telah menemukan bahwa salah satu programmer kami menambahkan baris berikut ke salah satu impor:

os.chdir(<path_to_a_local_folder>)

Ini menyebabkan pekerja Celery mengubah direktori kerjanya dari direktori kerja default proyek (di mana ia dapat menemukan tugas) ke direktori lain (di mana ia tidak dapat menemukan tugas).

Setelah menghapus baris kode ini, semua tugas ditemukan dan didaftarkan.


0

Celery tidak mendukung impor relatif jadi di my celeryconfig.py, Anda perlu impor mutlak.

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

0

Item tambahan ke daftar yang sangat berguna.

Saya menemukan Celery tidak memaafkan sehubungan dengan kesalahan dalam tugas (atau setidaknya saya belum dapat melacak entri log yang sesuai) dan tidak mendaftarkannya. Saya mengalami sejumlah masalah saat menjalankan Celery sebagai layanan, yang sebagian besar terkait dengan izin.

Terbaru terkait dengan izin menulis ke file log. Saya tidak memiliki masalah dalam pengembangan atau menjalankan seledri pada baris perintah, tetapi layanan melaporkan tugas tersebut sebagai tidak terdaftar.

Saya perlu mengubah izin folder log untuk mengaktifkan layanan untuk menulis padanya.


0

2 sen saya

Saya mendapatkan ini dalam gambar buruh pelabuhan menggunakan alpine. Pengaturan django dirujuk /dev/loguntuk masuk ke syslog. Aplikasi django dan pekerja seledri keduanya didasarkan pada gambar yang sama. Titik masuk gambar aplikasi django diluncurkan syslogdsaat dimulai, tetapi yang untuk pekerja seledri tidak. Ini menyebabkan hal-hal seperti ./manage.py shellgagal karena tidak akan ada /dev/log. Pekerja seledri tidak gagal. Sebaliknya, ia diam-diam mengabaikan peluncuran aplikasi lainnya, termasuk memuat shared_taskentri dari aplikasi dalam proyek django


0

Dalam kasus saya, kesalahannya adalah karena satu wadah membuat file dalam folder yang dipasang pada sistem file host dengan docker-compose.

Saya hanya perlu menghapus file yang dibuat oleh penampung di sistem host dan saya dapat meluncurkan proyek saya lagi.

sudo rm -Rf nama lipat

(Saya harus menggunakan sudo karena file tersebut dimiliki oleh pengguna root)

Versi Docker: 18.03.1


0

Jika Anda menggunakan autodiscover_tasks, pastikan bahwa Anda functionsakan terdaftar tetap di tasks.py, bukan file lain. Atau seledri tidak dapat menemukan yang functionsingin Anda daftarkan.

Gunakan app.register_taskjuga akan melakukan pekerjaan itu, tetapi tampaknya sedikit naif.

Silakan merujuk ke spesifikasi resmi ini 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

Tulis jalur yang benar untuk tugas file

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

}


0

saat menjalankan seledri dengan perintah "seledri -A conf worker -l info" semua tugas terdaftar di log seperti yang saya alami. conf.celery.debug_task saya mendapatkan kesalahan karena saya tidak memberikan jalur tugas yang tepat ini. Jadi mohon periksa ulang ini dengan menyalin dan menempelkan id tugas yang tepat.


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

0

Jawaban untuk masalah Anda terletak pada BARIS PERTAMA dari keluaran yang Anda berikan dalam pertanyaan Anda: /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, ))) . Tanpa konfigurasi yang tepat Celery tidak dapat melakukan apapun.

Alasan mengapa seledri tidak dapat ditemukan karena kemungkinan besar itu tidak ada di PYTHONPATH Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.