序章


非同期または非ブロッキング処理は、特定のタスクの実行をプログラムのメインフローから分離する方法です。 これには、ユーザー向けのコードを中断することなく実行できるなど、いくつかの利点があります。

メッセージパッシングは、プログラムコンポーネントが情報の通信と交換に使用できる方法です。 同期または非同期で実装でき、個別のプロセスが問題なく通信できるようにします。 メッセージキューは多くの場合、追加機能を実装し、パフォーマンスを向上させ、完全にメモリ内に常駐できるため、このタイプの使用法では、従来のデータベースの代わりにメッセージパッシングが実装されることがよくあります。

Celery は、非同期メッセージパッシングシステム上に構築されたタスクキューです。 プログラミングタスクをダンプできるバケットとして使用できます。 タスクを通過したプログラムは、引き続き実行して応答して機能し、その後、セロリをポーリングして、計算が完了したかどうかを確認し、データを取得できます。

セロリはPythonで書かれていますが、そのプロトコルは任意の言語で実装できます。 Webhookを介して他の言語でも機能できます。

プログラムの環境にジョブキューを実装することで、タスクを簡単にオフロードし、ユーザーからの対話を引き続き処理できます。 これは、アプリケーションの応答性を向上させ、長時間実行される計算の実行中にロックされないようにするための簡単な方法です。

このガイドでは、Ubuntu 12.04 VPSのメッセージングシステムとしてRabbitMQを使用して、セロリジョブキューをインストールして実装します。

コンポーネントをインストールします


Celeryをインストールする


CeleryはPythonで記述されているため、通常のPythonパッケージを処理するのと同じ方法で簡単にインストールできます。

メッセージングシステムをインストールするための仮想環境を作成することにより、Pythonパッケージを処理するための推奨手順に従います。 これにより、環境を安定させ、大規模なシステムに影響を与えないようにすることができます。

UbuntuのデフォルトリポジトリからPython仮想環境パッケージをインストールします。

sudo apt-get update
sudo apt-get install python-virtualenv

システムを実装するメッセージングディレクトリを作成します。

mkdir ~/messaging
cd ~/messaging

これで、次のコマンドを使用してセロリをインストールできる仮想環境を作成できます。

virtualenv --no-site-packages venv

仮想環境を構成したら、次のように入力してアクティブ化できます。

source venv/bin/activate

上記で作成した仮想環境で操作していることを反映して、プロンプトが変わります。 これにより、Pythonパッケージがグローバルではなくローカルにインストールされるようになります。

環境を非アクティブ化する必要がある場合(現在ではない)、次のように入力できます。

deactivate

環境をアクティブ化したので、pipを使用してセロリをインストールできます。

pip install celery

RabbitMQをインストールします


Celeryは、外部ソースからの要求を処理するためにメッセージングエージェントを必要とします。 このエージェントは「ブローカー」と呼ばれます。

リレーショナルデータベース、NoSQLデータベース、Key-Valueストア、実際のメッセージングシステムなど、ブローカーが選択できるオプションはかなりあります。

堅牢で安定したパフォーマンスを提供し、セロリとうまく相互作用するため、RabbitMQメッセージングシステムを使用するようにセロリを構成します。 使用目的に合った機能が含まれているため、優れたソリューションです。

UbuntuのリポジトリからRabbitMQをインストールできます。

sudo apt-get install rabbitmq-server

RabbitMQサービスは、インストール時にサーバー上で自動的に開始されます。

セロリインスタンスを作成する


セロリのタスクキューイング機能を使用するには、インストール後の最初のステップは、セロリインスタンスを作成することである必要があります。 これは、パッケージをインポートし、「アプリ」を作成してから、celeryがバックグラウンドで実行できるタスクを設定するという単純なプロセスです。

tasks.pyというメッセージングディレクトリ内にPythonスクリプトを作成して、ワーカーが実行できるタスクを定義しましょう。

sudo nano ~/messaging/tasks.py

最初にすべきことは、celeryパッケージからCelery関数をインポートすることです。

from celery import Celery

その後、デフォルトのRabbitMQサービスに接続するセロリアプリケーションインスタンスを作成できます。

from celery import Celery

app = Celery('tasks', backend='amqp', broker='amqp://')

Celery関数の最初の引数は、タスクを識別するためにタスクの前に付けられる名前です。

backendパラメーターは、バックグラウンドタスクのステータスを照会したり、その結果を取得したりする場合に必要なオプションのパラメーターです。

タスクが、プログラムで使用するための有用な値を返さずに、何らかの作業を行ってから終了する関数である場合は、このパラメーターを省略できます。 一部のタスクのみがこの機能を必要とする場合は、ここで有効にしてください。ケースバイケースで無効にすることができます。

brokerパラメーターは、ブローカーに接続するために必要なURLを指定します。 この場合、これはサーバーで実行されているRabbitMQサービスです。 RabbitMQは、「amqp」と呼ばれるプロトコルを使用して動作します。 RabbitMQがデフォルト構成で動作している場合、セロリはamqp://スキーム以外の情報と接続できません。

セロリタスクを構築する


まだこのファイルに、タスクを追加する必要があります。

各セロリタスクは、デコレータ@app.taskで導入する必要があります。 これにより、セロリはキューイング機能を追加できる機能を識別できます。 各デコレータの後に、ワーカーが実行できる関数を作成するだけです。

最初のタスクは、文字列をコンソールに出力する単純な関数です。

from celery import Celery

app = Celery('tasks', backend='amqp', broker='amqp://')

@app.task
def print_hello():
    print 'hello there'

この関数は有用な情報を返さないため(代わりにコンソールに出力します)、このタスクに関する状態情報を格納するためにバックエンドを使用しないようにceleryに指示できます。 これは内部的にはそれほど複雑ではなく、必要なリソースも少なくて済みます。

セロリ輸入セロリから

app = Celery(’tasks’、backend =’amqp’、broker =’amqp://’)

@アプリ .task (ignore_result = True) def print_hello():print’hello there’