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.
CELERY_IMPORTS = ("tasks", )
Jawaban:
Anda dapat melihat daftar tugas terdaftar saat ini di
celery.registry.TaskRegistry
kelas. Mungkin seledri Anda (di direktori saat ini) tidak adaPYTHONPATH
sehingga seledri tidak dapat menemukannya dan kembali ke default. Cukup tentukan secara eksplisit saat memulai seledri.Anda juga dapat mengatur
--loglevel=DEBUG
dan Anda mungkin akan segera melihat masalahnya.sumber
--loglevel=DEBUG
, ada kesalahan sintaks dalam tugas saya.celery worker
misalnya untukDjango
seperti inicelery --app=your_app.celery worker --loglevel=info
celery.registry.tasks
untuk melihat daftar semua tugas saya saat ini. Anda selalu dapat memeriksa dengan menjalankandir(celery.registry)
.--loglevel=DEBUG
dari sisi saya jugaSaya pikir Anda perlu memulai ulang server pekerja. Saya menemui masalah yang sama dan menyelesaikannya dengan memulai ulang.
sumber
celery inspect registered
--autoreload
yang akan memulai seledri setiap kali kode diubah.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.py
file khusus, itu harus dideklarasikan pada layanan seledri mulai seperti yang--settings=celery_settings.py
ditulis digivampire.sumber
Apakah Anda menggunakan
CELERY_IMPORTS
atauautodiscover_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 memilikidebug_task
tugas di filecelery.py
.Jika Anda tidak dapat melihat tugas-tugas Anda dalam daftar, silakan cek impor konfigurasi seledri Anda tugas dengan benar, baik dalam
--setting
,--config
,celeryconfig
atauconfig_from_object
.Jika Anda menggunakan irama seledri, pastikan nama tugasnya,
task
,, Anda gunakanCELERYBEAT_SCHEDULE
sesuai dengan nama di daftar tugas seledri.sumber
@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) }
Saya juga punya masalah yang sama; saya tambahkan
CELERY_IMPORTS=("mytasks")
di
celeryconfig.py
file saya untuk menyelesaikannya.sumber
CELERY_IMPORTS = ['my_module']
app = Celery('proj', broker='amqp://', backend='amqp://', include=['proj.tasks'])
please include = ['proj.tasks'] Anda harus pergi ke direktori teratas, lalu jalankan ini
tidak
di celeryconfig.py input import = ("path.ptah.tasks",)
tolong di modul lain panggil tugas !!!!!!!!
sumber
include
param perlu menjadi add jika Anda menggunakan impor relatif. Saya telah memecahkan masalah saya dengan menambahkannyaplease in other module invoke task!!!!!!!!
. Itu membantu.Menggunakan --setelan tidak berhasil untuk saya. Saya harus menggunakan yang berikut ini agar semuanya berfungsi:
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.
sumber
Bagi saya kesalahan ini diselesaikan dengan memastikan aplikasi yang berisi tugas-tugas dimasukkan di bawah pengaturan INSTALLED_APPS django.
sumber
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
'dalamINSTALLED_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 mycelery.py
fromapp.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
untuk
app.autodiscover_tasks( lambda: settings.INSTALLED_APPS + settings.INSTALLED_APPS_WITH_APPCONFIGS )
sumber
Apa yang berhasil bagi saya, adalah menambahkan nama eksplisit ke dekorator tugas seledri. Saya mengubah pernyataan tugas saya dari
@app.tasks
menjadi@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 !!!!")
sumber
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) }, }
sumber
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.sumber
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
sumber
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.
sumber
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
sumber
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.
sumber
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.
sumber
Solusi bagi saya untuk menambahkan baris ini ke / etc / default / celeryd
CELERYD_OPTS="-A tasks"
Karena ketika saya menjalankan perintah ini:
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"
sumber
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.
sumber
Hanya untuk menambahkan dua sen saya untuk kasus saya dengan kesalahan ini ...
Jalan saya
/vagrant/devops/test
denganapp.py
dan__init__.py
di dalamnya.Ketika saya menjalankan
cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=info
saya mendapatkan kesalahan ini.Tapi ketika saya menjalankannya seperti
cd /vagrant/devops/test && celery worker -A app.celery --loglevel=info
semuanya baik-baik saja.sumber
Saya telah menemukan bahwa salah satu programmer kami menambahkan baris berikut ke salah satu impor:
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.
sumber
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) } }
sumber
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.
sumber
2 sen saya
Saya mendapatkan ini dalam gambar buruh pelabuhan menggunakan alpine. Pengaturan django dirujuk
/dev/log
untuk masuk ke syslog. Aplikasi django dan pekerja seledri keduanya didasarkan pada gambar yang sama. Titik masuk gambar aplikasi django diluncurkansyslogd
saat dimulai, tetapi yang untuk pekerja seledri tidak. Ini menyebabkan hal-hal seperti./manage.py shell
gagal karena tidak akan ada/dev/log
. Pekerja seledri tidak gagal. Sebaliknya, ia diam-diam mengabaikan peluncuran aplikasi lainnya, termasuk memuatshared_task
entri dari aplikasi dalam proyek djangosumber
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.
(Saya harus menggunakan sudo karena file tersebut dimiliki oleh pengguna root)
Versi Docker: 18.03.1
sumber
Jika Anda menggunakan
autodiscover_tasks
, pastikan bahwa Andafunctions
akan terdaftar tetap ditasks.py
, bukan file lain. Atau seledri tidak dapat menemukan yangfunctions
ingin Anda daftarkan.Gunakan
app.register_task
juga 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. """
sumber
Tulis jalur yang benar untuk tugas file
app.conf.beat_schedule = { 'send-task': { 'task': 'appdir.tasks.testapp', 'schedule': crontab(minute='*/5'), },
}
sumber
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.
sumber
app = Celery(__name__, broker=app.config['CELERY_BROKER'], backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])
sumber
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.
sumber