2017-01-23 3 views
1

高可用性に適したセロリを作るために取り組んでいます私は、django_celeryプロジェクトとこのフォークのceleryをフォークして、必要なカスタマイズをしました。セロリのリンクは、次のコードを利用しbeat.pyへの変更を示していますdjango_celeryにカスタムモデルを追加するには

私はmodels.pyファイルをdjango_celeryするために、このロックモデルを追加し、うまく移行することができましたしました:で

from django.db import models 

@python_2_unicode_compatible 
class Lock(models.Model): 
    name = models.CharField(max_length=127, unique=True) 
    created = models.DateTimeField(auto_now=True) 

    class Meta: 
     verbose_name_plural = _('locks') 

    def __str__(self): 
     return self.name 

celery worker 
python manage.py runserver 
python manage.py shell 
:私は、次のコマンドを実行することができるよ、これらの変更と

from djcelery.models import Lock 
from datetime import datetime, timedelta 
from django.db import transaction, IntegrityError 


class Locked(object): 
    """A context manager to add a distributed mutex.""" 

    def __init__(self, name, timeout): 
     self.name = name 
     self.lock = None 
     self.timeout = timeout 

    def __enter__(self): 
     # first delete any expired locks 
     expired = datetime.utcnow() - timedelta(seconds=self.timeout) 
     Lock.objects.filter(name=self.name, created__lte=expired).delete() 
     # then try to get the lock 
     try: 
      Lock(name=self.name).save() 
     except IntegrityError: 
      transaction.rollback() 
      raise LockError('Could not acquire lock: {0}'.format(self.name)) 

    def __exit__(self, *args): 
     Lock.objects.filter(name=self.name).delete() 


class LockError(Exception): 
    """Exception thrown when the requested lock already exists.""" 

    pass 

:utilsのフォルダ内のセロリは、私は、このlocked.pyファイルを追加しました

私は、スケジューラを実行しようとすると、私はarrisesを発行します。

celery beat 

を私は次のエラーを取得する:

Traceback (most recent call last): 
    File "venv/bin/celery", line 11, in <module> 
    load_entry_point('celery', 'console_scripts', 'celery')() 
    File "/venv/src/celery/celery/__main__.py", line 30, in main 
    main() 
    File "/venv/src/celery/celery/bin/celery.py", line 81, in main 
    cmd.execute_from_commandline(argv) 
    File "/venv/src/celery/celery/bin/celery.py", line 793, in execute_from_commandline 
    super(CeleryCommand, self).execute_from_commandline(argv))) 
    File "/venv/src/celery/celery/bin/base.py", line 311, in execute_from_commandline 
    return self.handle_argv(self.prog_name, argv[1:]) 
    File "/venv/src/celery/celery/bin/celery.py", line 785, in handle_argv 
    return self.execute(command, argv) 
    File "/venv/src/celery/celery/bin/celery.py", line 717, in execute 
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0]) 
    File "/venv/src/celery/celery/bin/base.py", line 315, in run_from_argv 
    sys.argv if argv is None else argv, command) 
    File "/venv/src/celery/celery/bin/base.py", line 377, in handle_argv 
    return self(*args, **options) 
    File "/venv/src/celery/celery/bin/base.py", line 274, in __call__ 
    ret = self.run(*args, **kwargs) 
    File "/venv/src/celery/celery/bin/beat.py", line 72, in run 
    beat = partial(self.app.Beat, 
    File "/venv/lib/python2.7/site-packages/kombu/utils/__init__.py", line 325, in __get__ 
    value = obj.__dict__[self.__name__] = self.__get(obj) 
    File "/venv/src/celery/celery/app/base.py", line 572, in Beat 
    return self.subclass_with_self('celery.apps.beat:Beat') 
    File "/venv/src/celery/celery/app/base.py", line 504, in subclass_with_self 
    Class = symbol_by_name(Class) 
    File "/venv/lib/python2.7/site-packages/kombu/utils/__init__.py", line 96, in symbol_by_name 
    module = imp(module_name, package=package, **kwargs) 
    File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/venv/src/celery/celery/apps/beat.py", line 19, in <module> 
    from celery import VERSION_BANNER, platforms, beat 
    File "/venv/src/celery/celery/beat.py", line 35, in <module> 
    from .utils.locked import Locked, LockError 
    File "/venv/src/celery/celery/utils/locked.py", line 1, in <module> 
    from djcelery.models import Lock 
    File "/venv/src/django-celery/djcelery/models.py", line 30, in <module> 
    class TaskMeta(models.Model): 
    File "/venv/lib/python2.7/site-packages/django/db/models/base.py", line 105, in __new__ 
    app_config = apps.get_containing_app_config(module) 
    File "/venv/lib/python2.7/site-packages/django/apps/registry.py", line 237, in get_containing_app_config 
    self.check_apps_ready() 
    File "/venv/lib/python2.7/site-packages/django/apps/registry.py", line 124, in check_apps_ready 
    raise AppRegistryNotReady("Apps aren't loaded yet.") 
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. 

私はので、私は何が起こっているか分からない設定私のINSTALLED_APPSにdjceleryを持っていますこの時点で?

答えて

0

セロリはDjangoでよく使用され、Djangoと互換性がありますが、本来では Djangoアプリケーションではありません。あなたが作成した変更は、celery beatを実行すると、Djangoモデルがロードされるようになりました。モデルを使用できるようにするには、アプリケーションを最初に初期化する必要があります。これを行うための標準的な方法は、の設定後にdjango.setup()を呼び出して、DjangoのコードでDjango設定を見つけることができるようにすることです。あなたが設定が含まれている実際のモジュール名にproject.settingsを変更する必要が

import os 
import django 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings") 
django.setup() 

:それは何かのようである可能性があります。

1

あなたは、私が構造

pybilling 
- pybilling 
    - celeryconfig.py 

を持っているならば、私は

celery --app pybilling.celeryconfig:app beat 
コマンドとセロリビートを開始する必要がありますたとえばセロリコマンドの

-A APP, --app=APP app instance to use (e.g. module.attr_name)

を使用するアプリケーションインスタンスを指定する必要があります。

ここにceleryconfig.pyの内容を示します

from __future__ import absolute_import 

import os 

from celery import Celery 

# set the default Django settings module for the 'celery' program. 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pybilling.settings') 

from django.conf import settings # noqa 

app = Celery('pybilling') 

# Using a string here means the worker will not have to 
# pickle the object when using Windows. 
app.config_from_object('django.conf:settings') 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 
関連する問題