Celeryユーザーガイド中国語翻訳-APplication


Celeryは、アプリケーションまたはアプリケーションと呼ばれる使用前にインスタンス化する必要があります.appはスレッドが安全であり、異なる構成、コンポーネント、taskを有する複数のCeleryアプリケーションが同じプロセス空間に共存することができる.
#   Celery  
>>> from celery import Celery
>>> app = Celery()
>>> app

最後の行のテキスト化には、Celeryアプリケーションが表示されます.アプリケーションが属するクラスの名前、現在のメインモジュール名、およびメモリアドレスが含まれます.唯一重要な情報はモジュール名です.
Main Name
Celeryでtaskメッセージを送信する場合、このメッセージには実行するtaskの名前のみが含まれます.各workerは、task registryと呼ばれるtask名と対応する関数のマッピングを維持します.
taskを定義すると、taskはローカルに登録されます.
>>> @app.task
... def add(x, y):
...     return x + y

>>> add


>>> add.name
__main__.add

>>> app.tasks['__main__.add']

Celeryがtask関数がどのモジュールに属するかを検出できない場合、mainモジュール名を使用して初期task名を生成します.
この方法は、次の2つのシーンにのみ適用されます.
  • taskを定義するモジュールはプログラムとして
  • を実行する.
  • app python shellに
  • を作成
    # tasks.py
    from celery import Celery
    app = Celery()
    
    @app.task
    def add(x, y): return x + y
    
    if __name__ == '__main__':
        app.worker_main()

    tasksを直接実行すると.py、task名は__main__を接頭辞とするが、tasks.pyは他のプログラムにインポートされ、task名はtasksを接頭辞とする.次のようになります.
    >>> from tasks import add
    >>> add.name
    tasks.add

    メインモジュール名を直接指定することもできます.
    >>> app = Celery('tasks')
    >>> app.main
    'tasks'
    
    >>> @app.task
    ... def add(x, y):
    ...     return x + y
    
    >>> add.name
    tasks.add

    Configuration
    Celeryは、直接設定するか、専用構成モジュールを使用して構成できます.app.confプロパティで構成を表示または直接設定します.
    >>> app.conf.timezone
    'Europe/London'
    
    >>> app.conf.enable_utc = True

    または、app.conf.updateの方法で複数の構成を一度に更新します.
    >>> app.conf.update(
    ...     enable_utc=True,
    ...     timezone='Europe/London',
    ...)

    config_from_object app.config_from_object()メソッドは、構成モジュールまたはオブジェクトから構成をインポートします.注:config_を呼び出すfrom_object()メソッドは、その前に構成された設定をリセットします.
    モジュール名appを使用する.config_from_object()メソッドは、pythonモジュールの完全修飾名(fully qualified name)または「celeryconfig」、「myproj.config.celery」、または「myproj.config:CeleryConfig」などの特定の属性名を受信する.
    from celery import Celery
    
    app = Celery()
    app.config_from_object('celeryconfig')
    import celeryconfigを正常に実行できればappは正常に構成できます.
    モジュールオブジェクトを使用して、インポートしたモジュールオブジェクトを転送することもできますが、これは推奨されません.
    import celeryconfig
    
    from celery import Celery
    
    app = Celery()
    app.config_from_object(celeryconfig)

    prefork poolを使用する場合、モジュールをシーケンス化する必要がないため、モジュール名を使用する方法がより推奨されます.実際のアプリケーションで構成の問題やシーケンス化のエラーが発生した場合は、モジュール名を使用してみてください.
    構成クラスまたはオブジェクトの使用
    from celery import Celery
    
    app = Celery()
    
    class Config:
        enable_utc = True
        timezone = 'Europe/London'
    
    app.config_from_object(Config)

    config_from_envvar app.config_from_envvar()メソッドは、環境変数から構成モジュール名を受信する.
    import os
    from celery import Celery
    
    #: Set default configuration module name
    os.environ.setdefault('CELERY_CONFIG_MODULE', 'celeryconfig')
    
    app = Celery()
    app.config_from_envvar('CELERY_CONFIG_MODULE')

    環境変数を使用して構成モジュールを指定します.
    $ CELERY_CONFIG_MODULE="celeryconfig.prod" celery worker -l info

    Censored configuration
    Celery構成を表示する場合は、パスワード、キーなどの機密情報をフィルタする必要があります.Celeryは、表示構成を支援するいくつかの実用的な方法を提供しています.
    humanize()このメソッドは、行ごとに文字列形式の構成を返します.デフォルトには変更された構成のみが含まれます.組み込みのデフォルト構成を表示する場合は、with_defaultsパラメータをTrueに設定します.
    >>> app.conf.humanize(with_defaults=False, censored=True)

    table()このメソッドは、辞書形式の構成を返します.
    >>> app.conf.table(with_defaults=False, censored=True)

    Celeryは、正規表現一致キーを使用して削除するかどうかを判断するため、すべての機密情報を除去しません.ユーザーが機密情報を含むカスタム構成を追加した場合は、Celeryが機密構成としてマークされている可能性のある名前(API、TOKEN、KEY、SECRET、PASS、SIGNATURE、DATABASE)を使用して名前を付けることができます.
    Laziness
    適用例は不活性である.
    Celeryインスタンスを作成すると、次の操作のみが実行されます.
  • event用のlogical clock instance
  • を作成する
  • 作成task registry
  • は現在のアプリケーション(set_as_currentパラメータが無効でない限り)
  • に設定.
  • app.on_init()コールバック関数(デフォルトでは何も行わない)
  • を呼び出す.app.task()デコレーションは、task定義時に直ちにtaskを作成するのではなく、task使用時またはfinalized適用後に作成されます.
    次の例では、taskを使用するか、プロパティにアクセスする前にtaskは作成されません.
    >>> @app.task
    >>> def add(x, y):
    ...    return x + y
    
    >>> type(add)
    
    
    >>> add.__evaluated__()
    False
    
    >>> add        # 
    
    >>> add.__evaluated__()
    True

    アプリケーションのFinalizationは、app.finalize()メソッドを明示的に呼び出すか、またはappに暗黙的にアクセスすることを指す.tasksプロパティ.finalizedアプリケーション:
  • アプリケーション間で共有する必要があるtaskをコピーします.taskのデフォルトは共有ですが、task装飾器のsharedプロパティが無効になっている場合は、アプリケーションプライベートに属します.
  • すべての処理対象task装飾品
  • を評価する
  • は、すべてのtaskが現在のアプリケーションにバインドされていることを確認します.taskをアプリケーションにバインドして、構成からデフォルト値を読み込むことができます.

  • Breaking the chain
    現在のアプリケーションに依存してもよいが、アプリケーションインスタンスをapp chainと呼ぶことができる任意の必要なオブジェクトに渡すのがベストプラクティスである.
    #        (bad)
    
    from celery import current_app
    
    class Scheduler(object):
    
        def run(self):
            app = current_app
    #       (good)
    
    class Scheduler(object):
    
        def __init__(self, app):
            self.app = app

    開発モードでCELERY_を設定するTRACE_APP環境変数は、アプリケーションチェーンの切断時に異常を放出することができます.
    $ CELERY_TRACE_APP=1 celery worker -l info

    Abstract Tasks task()デコレーションを使用して作成されたtaskは、celery.app.taskモジュールのTaskベースクラスから継承されます.クラスを継承するとtaskクラスをカスタマイズできます.
    from celery import Task
    #    from celery.app.task import Task
    
    class DebugTask(Task):
    
        def __call__(self, *args, **kwargs):
            print('TASK STARTING: {0.name}[{0.request.id}]'.format(self))
            return super(DebugTask, self).__call__(*args, **kwargs)
    __call__()メソッドを書き換える場合は、superを呼び出してください.これによりtaskが直接呼び出されると、ベースクラスのデフォルトイベントが実行されます.Taskベースクラスは、特定のアプリケーションにバインドされていないため、特殊です.taskがアプリケーションにバインドされると、デフォルト値などを設定するために構成が読み込まれます.
  • baseパラメータによりベースクラス
    @app.task(base=DebugTask)
    def add(x, y):
        return x + y
  • を指定する.
  • app.Task属性によりベースクラス
    >>> from celery import Celery, Task
    
    >>> app = Celery()
    
    >>> class MyBaseTask(Task):
    ...    queue = 'hipri'
    
    >>> app.Task = MyBaseTask
    >>> app.Task
    
    
    >>> @app.task
    ... def add(x, y):
    ...     return x + y
    
    >>> add
    
    
    >>> add.__class__.mro()
    [>,
     ,
     ,
     ]
  • を指定する.