Kereviz türü tescilsiz görev alındı ​​(örnek çalıştırın)


103

Kereviz belgelerinden örnek almaya çalışıyorum .

Koşarım: 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())

Aynı klasörde celeryconfig.py:

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

"Run_task.py" komutunu çalıştırdığımda:

python konsolunda

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

celeryd sunucusundaki hatalar

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

Lütfen sorunun ne olduğunu açıklayın.


12
Merhaba, lütfen sorunun ne olduğunu ve nasıl çözdüğünüzü paylaşır mısınız? Kabul edilen cevap, başkalarının bu sorunu nasıl çözebileceğini netleştirmiyor. Teşekkürler.
Jordan Reiter

3
Ürdün'le birlikteyim - bu hiç yararlı olmadı. Olumsuz oy verildi.
Jay Taylor

2
aiho'nun cevabı doğru cevap:CELERY_IMPORTS = ("tasks", )
Alp

Yanıtlar:


50

celery.registry.TaskRegistrySınıftaki kayıtlı görevlerin mevcut listesini görebilirsiniz . Celeryconfig'iniz (mevcut dizinde) bulunmayabilir, PYTHONPATHbu yüzden kereviz onu bulamaz ve varsayılanlara geri döner. Kerevizi başlatırken açıkça belirtmeniz yeterlidir.

celeryd --loglevel=INFO --settings=celeryconfig

Ayrıca ayarlayabilirsiniz --loglevel=DEBUGve muhtemelen sorunu hemen görmelisiniz.


5
+1 --loglevel=DEBUG, görevimde sözdizimi hatası vardı.
Jacob Valenta

15
celeryd artık kullanılmıyor. Şimdi biri çalışmalıdır celery workeriçin örneğin Djangoböylecelery --app=your_app.celery worker --loglevel=info
andilabs

Benim için (kereviz 3.1.23), celery.registry.tasksmevcut tüm görevlerimin bir listesini görmek için kullanmak zorunda kaldım . Her zaman koşarak kontrol edebilirsiniz dir(celery.registry).
Nick Brady

için --loglevel=DEBUGde benim tarafımdan
Shobi

67

Çalışan sunucuyu yeniden başlatmanız gerektiğini düşünüyorum. Aynı problemle karşılaşıyorum ve yeniden başlatarak çözüyorum.


8
Teşekkürler! Keşke bunu bir saat önce
Nexus

2
Bu benim için düzeltti. Celeryd betikleri kullanıyorsanız, çalışan görev modüllerinizi başlangıçta içe aktarır. Daha sonra daha fazla görev işlevi oluştursanız veya var olanları değiştirseniz bile, çalışan, bellek içi kopyalarını okurken olduğu gibi kullanacaktır.
Mark

2
Not: Görevlerinizin kayıtlı olup olmadığını çalıştırarak doğrulayabilirsinizcelery inspect registered
Nick Brady

1
Ayrıca --autoreloadkerevizi her kod değiştirildiğinde yeniden başlatacak seçeneği ile başlayabilirsiniz .
Sergey Lyapustin

Maalesef kullanımdan kaldırıldı. Bu bağlantıdan bir çözüm kullanılabilir: avilpage.com/2017/05/…
Tomasz Szkudlarek

51

Ben de aynı sorunu yaşadım: Nedeni, "Received unregistered task of type.."celeryd hizmetinin görevleri hizmet başlangıcında bulup kaydetmemesiydi (başlattığınızda bunların listesi görünür ./manage.py celeryd --loglevel=info).

Bu görevler CELERY_IMPORTS = ("tasks", )ayarlar dosyasında belirtilmelidir.
Eğer özel bir celery_settings.pydosyanız varsa, --settings=celery_settings.pydigivampire'ın yazdığı gibi celeryd servis başlangıcında beyan edilmelidir.


1
Teşekkürler, gerçekten sorun yaşadım çünkü kerevizi manage.py komutunu kullanmak yerine ~ / path / to / celery / celeryd kullanarak başladım!
Antoine

29

İster kullanın CELERY_IMPORTSister autodiscover_tasks, önemli olan nokta görevlerin bulunabilmesi ve Celery'de kayıtlı görevlerin adlarının, işçilerin almaya çalıştıkları isimlerle eşleşmesidir.

Kerevizi fırlattığınızda, celery worker -A project --loglevel=DEBUGgörevlerin adını görmeniz gerektiğini söyleyin . Örneğin, bir debug_taskgörevim varsa 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

Listede görevlerinizi göremiyorsanız, doğru bir şekilde kereviz yapılandırma ithalatı görevleri kontrol ediniz ya --setting, --config, celeryconfigveya config_from_object.

Eğer kereviz yendi kullanıyorsanız, emin görev isim yapmak, task, içeri kullanmak CELERYBEAT_SCHEDULEkereviz görev listesinde maçları adını.


Bu çok yardımcı oldu. Görevin adı, CELERYBEAT_SCHEDULE
ss_millionaire

* Önemli olan, görevlerin bulunabilmesi ve Celery'de kayıtlı görevlerin adlarının, işçilerin almaya çalıştıkları isimlerle eşleşmesidir. * İyi bir nokta!!!
Light.G

Bu doğru cevap. BEAT_SCHEDULER'daki görev adınız, otomatik olarak keşfedilen görevler listesinde görünenlerle eşleşmelidir. Yani eğer kullandıysanız @task(name='check_periodically'), ritim programına koyduğunuzla eşleşmelidir, IE:CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
Mormoran

18

Benim de aynı sorunu yaşadım; ekledim

CELERY_IMPORTS=("mytasks")

Benim de celeryconfig.pydosyaya bunu çözmek için.


7
Bunun bir liste veya tuple olması gerektiğini unutmayın:CELERY_IMPORTS = ['my_module']
2013

Bu benim için yaptı
Riziero

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

lütfen include = ['proj.tasks'] En üst dizine gitmeli, sonra bunu çalıştırmalısın

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

değil

celery -A celeryapp worker --loglevel=info

celeryconfig.py giriş ithalatı = ("path.ptah.tasks",)

lütfen diğer modülde görevi çağırın !!!!!!!!


1
includeEğer göreli ithalat kullanıyorsanız param gerek eklenti olarak.
Sorunumu

1
Cevabınızı bu diziye oyladı please in other module invoke task!!!!!!!!. Yardımcı oldu.
VolArt

8

--Settings'i kullanmak benim için işe yaramadı. Her şeyin işe yaraması için aşağıdakileri kullanmam gerekiyordu:

celery --config=celeryconfig --loglevel=INFO

CELERY_IMPORTS eklenmiş celeryconfig dosyası şöyledir:

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

Kurulumum biraz daha karmaşıktı çünkü kerevizi arka plan programı olarak başlatmak için süpervizörü kullanıyorum.


8

Benim için bu hata, görevleri içeren uygulamanın django'nun INSTALLED_APPS ayarına dahil edilmesini sağlayarak çözüldü.


Ayrıca, görevlere <app> /tasks.py
np8

3

Django uygulamama biraz sinyal işleme eklediğimde bu sorunu gizemli bir şekilde ortaya çıkardım. Bunu yaparken uygulamayı bir AppConfig kullanacak şekilde dönüştürdüm, yani sadece 'booking'içinde' olarak okumak yerine INSTALLED_APPSokur 'booking.app.BookingConfig'.

Kereviz araçları ekledim böylece, bu ne anlamıyor INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)benim django ayarlarına ve gözlerimi modifiye celery.pygelen

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

-e

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

3

Benim için işe yarayan şey, kereviz görev dekoratörüne açık bir isim eklemekti. Olan görev bildirimimi olarak @app.tasksdeğiştirdim@app.tasks(name='module.submodule.task')

İşte bir örnek

# 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'teki görevleri çalıştırırken de aynı sorunu yaşadım. Kereviz göreceli ithalatı sevmez celeryconfig.py, bu yüzden benim için tam paket adını açıkça belirlemem gerekiyordu:

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

Keşke kereviz belgelerinin tam paket adlarıyla daha fazla örneği olsaydı. Bu cevapta full.path.to.add'yi gördükten sonra ithalata ihtiyacım olmadığını öğrendim. Çözümün basit olduğunu biliyordum ve app.conf.beat_schedule için daha iyi bir örneğe ihtiyacım vardı.
zerocog

2

Garip bir şekilde bu, eksik bir paketten de kaynaklanıyor olabilir. Gerekli tüm paketleri kurmak için pip çalıştırın: pip install -r requirements.txt

autodiscover_tasks eksik paketleri kullanan görevleri toplamıyordu.


1
Benzer bir sorun yaşadım. İçe aktarma sırasında meydana gelen bir istisna, otomatik keşfin bazı bölümlerinin tamamlanmamasına neden oluyor.
Tim Tisdall

Ahh evet, mantıklı. Teşekkürler
kakoma

2

Kereviz görevini bir Python Kabuğuna aktarmayı deneyin - Kereviz, kötü bir ithalat beyanı nedeniyle görevlerinizi sessizce kaydedemiyor olabilir.

ImportErrorTasvirler.py dosyamda, Celery'in modüldeki görevleri kaydetmemesine neden olan bir istisna vardı . Diğer tüm modül görevleri doğru şekilde kaydedildi.

Bu hata, Kereviz görevini bir Python Kabuğu içinde içe aktarmayı deneyene kadar açık değildi. Kötü içe aktarma ifadesini düzelttim ve ardından görevler başarıyla kaydedildi.


Bu benim de davamdı. Eksik bir ithalat vardı. Sorun, kerevizin sessizce başarısız olması.
Redgren Grumbholdt

1

Django ile herhangi bir sorunum olmadı . Ama Flask'ı kullanırken bununla karşılaştım . Çözüm, yapılandırma seçeneğini ayarlamaktı.

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

Django'dayken, sadece şunlara sahiptim:

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


1

Ben de bu sorunla karşılaştım, ancak tam olarak aynı değil, bu yüzden sadece FYI. Son yükseltmeler, bu dekoratör sözdizimi nedeniyle bu hata mesajına neden oluyor.

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

@task('my_server_check')

Sadece değiştirmek gerekiyordu

@task()

Neden olduğuna dair hiçbir fikrim yok.


1

Uygulama yapılandırmasını bunun gibi yüklü uygulamalarda kullanıyorsanız:

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

Ardından, yapılandırma uygulamanızda, görevi şu şekilde hazır yönteminde içe aktarın:

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

Diğer bazı yanıtların daha önce işaret ettiği gibi, kerevizin bağımlılık sorunları ve ayrıca herhangi bir sözdizimi veya kod sorunu da dahil olmak üzere görevleri sessizce görmezden gelmesinin birçok nedeni vardır.

Bunları bulmanın hızlı bir yolu koşmaktır:

./manage.py check

Çoğu zaman, bildirilen hataları düzelttikten sonra görevler kereviz tarafından tanınır.


1

task.py dosyanızı veya eşzamansız yöntemlerinizin depolandığı yeri eklediniz mi?

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

0

Bu tür bir hatayla karşılaşıyorsanız, birkaç olası neden vardır, ancak bulduğum çözüm, / etc / defaults / celeryd içindeki celeryd yapılandırma dosyamın, benim spesifik django projem için değil, standart kullanım için yapılandırılmış olmasıydı. Kereviz belgelerinde belirtilen formata dönüştürdüğüm anda her şey yolundaydı.


0

Bu satırı / etc / default / celeryd'e eklememin çözümü

CELERYD_OPTS="-A tasks"

Çünkü bu komutları çalıştırdığımda:

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

Yalnızca son komut, görev adlarını gösteriyordu.

Ayrıca CELERY_APP satırı / etc / default / celeryd eklemeyi denedim ama bu da işe yaramadı.

CELERY_APP="tasks"

0

Django-celery'deki PeriodicTask sınıflarıyla ilgili bir sorun yaşadım, oysa kereviz işçisini başlatırken isimleri iyi görünüyordu her yürütme tetiklendi:

KeyError: u'my_app.tasks.run '

Görevim 'CleanUp' adlı bir sınıftı, sadece 'çalıştır' adı verilen bir yöntem değil.

'Djcelery_periodictask' tablosunu kontrol ettiğimde, güncel olmayan girişler gördüm ve bunları silmek sorunu çözdü.


0

Sadece bu hatayla davam için iki sentimi eklemek için ...

Benim yolum /vagrant/devops/testonunla app.pyve __init__.pyiçinde.

Çalıştırdığımda cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=infobu hatayı alıyorum.

Ama cd /vagrant/devops/test && celery worker -A app.celery --loglevel=infoher şey yolundaymış gibi çalıştırdığımda .


0

Programcılarımızdan birinin aşağıdaki satırı ithalatlardan birine eklediğini buldum:

os.chdir(<path_to_a_local_folder>)

Bu, Celery çalışanının çalışma dizinini projenin varsayılan çalışma dizininden (görevleri bulabileceği) farklı bir dizine (görevleri bulamadığı) değiştirmesine neden oldu.

Bu kod satırını kaldırdıktan sonra, tüm görevler bulundu ve kaydedildi.


0

Kereviz, göreli ithalatı desteklemiyor, bu yüzden benim celeryconfig.py'imde mutlak ithalata ihtiyacınız var.

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

0

Gerçekten kullanışlı bir listeye ek bir öğe.

Görevlerdeki hatalarla ilgili olarak Kerevizi affetmez buldum (veya en azından uygun günlük girişlerini izleyemedim) ve bunları kaydetmiyor. Hizmet olarak Kereviz kullanmakla ilgili bir takım sorunlar yaşadım, bunlar çoğunlukla izinlerle alakalıydı.

Bir günlük dosyasına yazma izinleriyle ilgili en son bilgiler. Komut satırında kereviz geliştirme veya çalıştırma konusunda herhangi bir sorun yaşamadım, ancak hizmet görevi kayıtsız olarak bildirdi.

Hizmetin yazmasını sağlamak için günlük klasörü izinlerini değiştirmem gerekiyordu.


0

2 sentim

Bunu alpine kullanarak bir liman işçisi görüntüsünde alıyordum. Syslog'da /dev/logoturum açmak için başvurulan django ayarları . Django uygulaması ve kereviz işçisi aynı görüntüye dayanıyordu. Django uygulaması görselinin giriş noktası syslogdbaşlangıçta başlıyordu, ancak kereviz işçisinin giriş noktası değildi. Bu, gibi şeylerin ./manage.py shellbaşarısız olmasına neden oluyordu çünkü hiç olmayacaktı /dev/log. Kereviz işçisi başarısız değildi. Bunun yerine, sessizce shared_task, django projesindeki uygulamalardan girişlerin yüklenmesini içeren, uygulamanın geri kalanını görmezden geliyordu.


0

Benim durumumda hata, bir konteynerin docker-compose ile ana dosya sistemine monte edilmiş bir klasörde dosyalar oluşturmasıydı.

Sadece ana sistemde konteyner tarafından oluşturulan dosyaları kaldırmak zorunda kaldım ve projemi yeniden başlatabildim.

sudo rm -Rf klasör adı

(Dosyalar kök kullanıcıya ait olduğu için sudo kullanmam gerekiyordu)

Docker sürümü: 18.03.1


0

Kullanıyorsanız autodiscover_tasks, başka bir dosyada değil, functionskayıtlı olduğunuzdan emin olun tasks.py. Ya da functionskayıt olmak istediğiniz kerevizi bulamıyorsunuz .

Kullanmak app.register_taskda işi yapacak, ancak biraz saf görünüyor.

Lütfen bu resmi spesifikasyona bakın 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

Dosya görevlerine doğru yolu yazın

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

}


0

kerevizi "kereviz -A conf işçi -l info" komutuyla çalıştırırken, yaptığım gibi tüm görevler günlükte listelendi. conf.celery.debug_task hatayı alıyordum çünkü bu tam görev yolunu vermiyordum. Bu nedenle, tam görev kimliğini kopyalayıp yapıştırarak bunu lütfen tekrar kontrol edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.