celeryでタスク非同期処理(Python)

celeryは、非同期でタスクを実行できるqueue/job queueのフレームワークです。

celeryは、ジョブキューイングシステムです。

ジョブキューイングシステムとは、何かしらの処理をジョブ単位で監視して、それをキューに積んでおき、あとでキューから1つずつジョブを取り出して実行していくシステムのことを指します。

キューに積んで1つずつ処理していくため、サーバーの負荷軽減に利用できたりします。

Latest stable docs

前提条件

Macで動作確認しています。

事前準備

rabbitmqをインストールしてください。

rabbitmqは、メッセージキューイング処理を行うことができるオープンソースソフトウェアです。

pythonからceleryを利用するために、以下のモジュールをインストールしてください。

実装

早速実装していきましょう。先ほどインストールしたrabbitmqは起動したままにしておいてください。

また、以下のフォルダとファイルを作成してください。

バックグラウンド実行

最初に、celeryのworkerを書きます。

別のterminalを立ち上げて、以下のコマンドを実行してください。

workerが動いたらmain.pyに実行処理を書きます。

 プログラムを実行します。

workerを動かしているterminalを確認すると以下の出力がされています。

実行いただけるとわかると思いますが、tasks.pyのbuild_serverは、time.sleep(10)関数で10秒間処理を待っています。

しかし、main.pyのprint('doing...')関数は、直ぐに実行されたと思います。

build_serverのタスク処理は、バックグラウンドで処理されているため、main.pyの処理は即座に終了したわけです。

ループで処理を確認するとよりわかりやすいかもしれません。

グルーピング

先ほどのbuild_serverをグルーピングすることもできます。

workerをctrl+cで止めて、再び下記のコマンドを実行します(taskを読み直す)。

main.pyの呼び出し先を変更します。

実行します。

無事にグルーピングされました。

コールバック

コールバックも実装できます。

workerをctrl+cで止めて、再び下記のコマンドを実行します(taskを読み直す)。

main.pyも以下のように変更します。

実行してみましょう。

taskが完了したら、clearn upが表示されています。

パイプライン

パイプラインも利用することができます。

workerをctrl+cで止めて、再び下記のコマンドを実行します(taskを読み直す)。

main.pyを書き換えます。

実行します。

便利ですね。

まとめ

簡単なceleryの使い方をまとめました。

次は、Djangoを使った方法を勉強しようと思います。

コメントを残す