Estou tentando executar um exemplo da documentação do Celery.
Eu corro: 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())
Na mesma pasta celeryconfig.py:
CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300
Quando executo "run_task.py":
no console python
eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False
erros no servidor 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'
Explique qual é o problema.
CELERY_IMPORTS = ("tasks", )
Respostas:
Você pode ver a lista atual de tarefas registradas na
celery.registry.TaskRegistry
classe. Pode ser que seu celeryconfig (no diretório atual) não esteja em,PYTHONPATH
então o aipo não pode localizá-lo e voltar aos padrões. Basta especificar explicitamente ao iniciar o aipo.Você também pode definir
--loglevel=DEBUG
e provavelmente verá o problema imediatamente.fonte
--loglevel=DEBUG
, ocorreu um erro de sintaxe na minha tarefa.celery worker
por exemplo, paraDjango
assimcelery --app=your_app.celery worker --loglevel=info
celery.registry.tasks
para ver uma lista de todas as minhas tarefas atuais. Você sempre pode verificar executandodir(celery.registry)
.--loglevel=DEBUG
do meu lado tambémAcho que você precisa reiniciar o servidor de trabalho. Encontro o mesmo problema e resolvo reiniciando.
fonte
celery inspect registered
--autoreload
que irá reiniciar o aipo cada vez que o código for alterado.Eu tive o mesmo problema: O motivo
"Received unregistered task of type.."
disso foi que o serviço celeryd não encontrou e registrou as tarefas no início do serviço (aliás, a lista deles fica visível quando você inicia./manage.py celeryd --loglevel=info
).Essas tarefas devem ser declaradas no
CELERY_IMPORTS = ("tasks", )
arquivo de configurações.Se você tem um especial
celery_settings.py
arquivo ele deve ser declarado no início do serviço--settings=celery_settings.py
celeryd conforme digivampire escreveu.fonte
Se você usa
CELERY_IMPORTS
ouautodiscover_tasks
, o importante é que as tarefas podem ser encontradas e o nome das tarefas registradas no Celery deve corresponder aos nomes que os trabalhadores tentam buscar.Quando você inicia o Celery, digamos
celery worker -A project --loglevel=DEBUG
, você deve ver o nome das tarefas. Por exemplo, se eu tiver umadebug_task
tarefa em meucelery.py
.Se você não pode ver as suas tarefas na lista, por favor, verifique suas importações de configuração aipo as tarefas corretamente, seja em
--setting
,--config
,celeryconfig
ouconfig_from_object
.Se você estiver usando a batida de aipo, certifique-se de que o nome da tarefa,,
task
você usa emCELERYBEAT_SCHEDULE
corresponde ao nome na lista de tarefas de aipo.fonte
@task(name='check_periodically')
, ele deve corresponder ao que você colocou na programação de batida, ou seja:CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
Eu também tive o mesmo problema; Eu adicionei
no meu
celeryconfig.py
arquivo para resolvê-lo.fonte
CELERY_IMPORTS = ['my_module']
inclua = ['proj.tasks'] Você precisa ir para o diretório superior e executar
não
em seu celeryconfig.py input import = ("path.ptah.tasks",)
por favor, em outro módulo invoque a tarefa !!!!!!!!
fonte
include
parâmetro precisa ser adicionado se você estiver usando importações relativas.please in other module invoke task!!!!!!!!
. Ajudou.Usar --settings não funcionou para mim. Tive que usar o seguinte para fazer tudo funcionar:
Aqui está o arquivo celeryconfig que tem CELERY_IMPORTS adicionado:
Minha configuração foi um pouco mais complicada porque estou usando o supervisor para iniciar o aipo como um daemon.
fonte
Para mim, esse erro foi resolvido garantindo que o aplicativo que contém as tarefas foi incluído na configuração INSTALLED_APPS do django.
fonte
Eu tive esse problema misteriosamente surgindo quando adicionei algum tratamento de sinal ao meu aplicativo django. Ao fazer isso, converti o aplicativo para usar um AppConfig, o que significa que em vez de simplesmente ler como
'booking
'emINSTALLED_APPS
, ele leu'booking.app.BookingConfig'
.Celery não entende o que isso significa, então eu adicionei,
INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)
às minhas configurações django, e modifiquei meucelery.py
depara
fonte
O que funcionou para mim foi adicionar um nome explícito ao decorador de tarefas de aipo. Eu mudei minha declaração de tarefa de
@app.tasks
para@app.tasks(name='module.submodule.task')
Aqui está um exemplo
fonte
Eu tive o mesmo problema ao executar tarefas do Celery Beat. O aipo não gosta de importações relativas, então, no meu
celeryconfig.py
, tive que definir explicitamente o nome completo do pacote:fonte
Isso, estranhamente, também pode ser devido a um pacote ausente. Execute o pip para instalar todos os pacotes necessários:
pip install -r requirements.txt
autodiscover_tasks
não estava pegando tarefas que usavam pacotes ausentes.fonte
Não tive nenhum problema com o Django . Mas encontrei isso quando estava usando o Flask . A solução foi definir a opção de configuração.
celery worker -A app.celery --loglevel=DEBUG --config=settings
enquanto com Django, eu só tinha:
python manage.py celery worker -c 2 --loglevel=info
fonte
Eu também encontrei esse problema, mas não é exatamente o mesmo, então apenas para sua informação. As atualizações recentes causam essa mensagem de erro devido a esta sintaxe do decorador.
ERROR/MainProcess] Received unregistered task of type 'my_server_check'.
@task('my_server_check')
Teve que ser mudado para apenas
@task()
Não tenho ideia do porquê.
fonte
Se você estiver usando a configuração de aplicativos em aplicativos instalados como este:
Em seguida, em seu aplicativo de configuração, importe a tarefa no método pronto como este:
fonte
Se você está encontrando esse tipo de erro, existem várias causas possíveis, mas a solução que encontrei foi que meu arquivo de configuração do celeryd em / etc / defaults / celeryd foi configurado para uso padrão, não para o meu projeto django específico. Assim que o converti para o formato especificado nos documentos do aipo , tudo correu bem.
fonte
A solução para mim adicionar esta linha a / etc / default / celeryd
Porque quando eu executo esses comandos:
Apenas o último comando estava mostrando nomes de tarefas.
Também tentei adicionar a linha CELERY_APP / etc / default / celeryd, mas também não funcionou.
fonte
Tive o problema com as classes PeriodicTask no django-celery, enquanto seus nomes apareciam bem ao iniciar o trabalhador do aipo a cada execução acionada:
KeyError: u'my_app.tasks.run '
Minha tarefa era uma classe chamada 'CleanUp', não apenas um método chamado 'run'.
Quando verifiquei a tabela 'djcelery_periodictask', vi entradas desatualizadas e excluí-las corrigiu o problema.
fonte
Só para somar meus dois centavos para o meu caso com esse erro ...
Meu caminho está
/vagrant/devops/test
comapp.py
e__init__.py
nele.Quando eu executo
cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=info
, recebo este erro.Mas quando eu executo como se
cd /vagrant/devops/test && celery worker -A app.celery --loglevel=info
tudo estivesse OK.fonte
Descobri que um de nossos programadores adicionou a seguinte linha a uma das importações:
Isso fez com que o trabalhador Celery mudasse seu diretório de trabalho do diretório de trabalho padrão dos projetos (onde ele poderia encontrar as tarefas) para um diretório diferente (onde ele não poderia encontrar as tarefas).
Após remover esta linha de código, todas as tarefas foram localizadas e registradas.
fonte
O aipo não oferece suporte a importações relativas, portanto, em meu celeryconfig.py, você precisa de importação absoluta.
fonte
Um item adicional a uma lista realmente útil.
Achei o Celery implacável em relação a erros nas tarefas (ou pelo menos não consegui rastrear as entradas de log apropriadas) e ele não os registra. Tive vários problemas ao executar o Celery como um serviço, que estavam predominantemente relacionados a permissões.
O mais recente relacionado às permissões de gravação em um arquivo de log. Não tive problemas no desenvolvimento ou na execução do aipo na linha de comando, mas o serviço relatou a tarefa como não registrada.
Eu precisava alterar as permissões da pasta de log para permitir que o serviço gravasse nela.
fonte
Meus 2 centavos
Eu estava obtendo isso em uma imagem docker usando alpine. As configurações do django referenciadas
/dev/log
para registro no syslog. O aplicativo django e o trabalhador do aipo foram baseados na mesma imagem. O ponto de entrada da imagem do aplicativo django estava sendosyslogd
iniciado no início, mas o do trabalhador de aipo não. Isso estava causando./manage.py shell
falhas, porque não haveria nenhuma/dev/log
. O trabalhador do aipo não estava falhando. Em vez disso, estava apenas ignorando silenciosamente o resto do lançamento do aplicativo, que incluía o carregamento deshared_task
entradas de aplicativos no projeto djangofonte
No meu caso, o erro foi porque um contêiner criou arquivos em uma pasta que foram montados no sistema de arquivos host com docker-compose.
Tive apenas que remover os arquivos criados pelo container no sistema host e pude iniciar meu projeto novamente.
(Tive que usar o sudo porque os arquivos eram propriedade do usuário root)
Versão do Docker: 18.03.1
fonte
Se você usar
autodiscover_tasks
, certifique-se de que seufunctions
para ser registrado permaneça notasks.py
, e não em qualquer outro arquivo. Ou o aipo não consegue encontrar ofunctions
que deseja registrar.O uso
app.register_task
também fará o trabalho, mas parece um pouco ingênuo.Por favor, consulte esta especificação oficial de
autodiscover_tasks
.fonte
Escreva o caminho correto para as tarefas de arquivo
}
fonte
ao executar o aipo com o comando "celery -A conf worker -l info", todas as tarefas foram listadas no log como eu estava tendo. conf.celery.debug_task Eu estava recebendo o erro porque não estava fornecendo este caminho de tarefa exato. Então, por favor, verifique novamente copiando e colando a identificação exata da tarefa.
fonte
fonte
A resposta para o seu problema está na PRIMEIRA LINHA do resultado que você forneceu em sua pergunta:
/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, )))
. Sem a configuração correta, o Celery não é capaz de fazer nada.O motivo pelo qual ele não consegue encontrar o celeryconfig é mais provável que ele não esteja em seu PYTHONPATH.
fonte
Resolvi meu problema, minha 'tarefa' está em um pacote Python chamado 'celery_task', quando saio deste pacote e executo o comando
celery worker -A celery_task.task --loglevel=info
. Funciona.fonte