Celery:分散タスクキュー

celery

Pythonにおける非同期処理基盤:Celeryの概要と基本的な使い方

Webアプリケーションを運用していると、 「時間のかかる処理をバックグラウンドで実行したい」 「ユーザー操作とは切り離して処理を実行したい」 といった要件が必ず出てきます。

そのような場面で広く利用されているのが Celery(セロリ) です。

Celeryは、Pythonで実装された 分散タスクキュー(Distributed Task Queue)であり、 非同期処理や定期実行処理を安全かつ効率的に管理できます。

本記事では、Celeryの基本概念から、 最低限必要な構成要素、 基本コマンドまでを整理します。

Celeryとは何か

Celeryは、タスク(処理)をキューに登録し、 ワーカープロセスがそれを取り出して実行する仕組みです。

通常のWebアプリケーションでは、 ユーザーのリクエストを受けたら即座に処理を返します。 しかし、

  • 大量データの集計
  • メールの一斉送信
  • 画像変換処理
  • 外部APIとの重い通信処理

といった時間のかかる処理を同期的に行うと、 レスポンスが遅くなり、ユーザー体験が悪化します。

Celeryを使うことで、 これらの処理をバックグラウンドで実行し、 Webアプリケーションの応答性を保つことができます。

Celeryの基本構成

Celeryは主に以下の要素で構成されます。

  • Producer(アプリ側):タスクを登録する側
  • Broker(ブローカー):タスクを保管するキュー
  • Worker(ワーカー):タスクを実行するプロセス

一般的な構成では、 Brokerとして RedisRabbitMQ を使用します。

Celeryが適している場面

  • Webアプリケーションの非同期処理
  • メール配信処理
  • レポート生成バッチ
  • APIポーリング処理
  • 分散処理が必要な大量計算

特にDjangoやFlaskなどのPython製Webフレームワークと相性が良く、 実運用でも広く利用されています。

Celeryの基本インストール

まず、Python環境にCeleryをインストールします。

$ pip install celery

Redisを利用する場合は、Redisクライアントも必要です。

$ pip install redis

Redisサーバーが未インストールの場合は以下のように導入します。

Debian / Ubuntu系

# apt install redis-server

Fedora / Rocky Linux系

# dnf install redis

最小構成のCeleryアプリ例

from celery import Celery

app = Celery(
    "sample",
    broker="redis://localhost:6379/0"
)

@app.task
def add(x, y):
    return x + y

ワーカーの起動

Celeryワーカーを起動します。

$ celery -A tasks worker --loglevel=info

これにより、 タスクキューを監視するワーカープロセスが起動します。

タスクの実行

Pythonシェルからタスクを実行できます。

$ python

>>> from tasks import add
>>> add.delay(4, 5)

.delay() を使うことで、 非同期タスクとしてキューに登録されます。

ワーカー側で処理が実行され、 結果が返されます。

定期実行(Celery Beat)

Celeryには定期実行機能もあります。 これを実現するのが Celery Beat です。

Beatを利用することで、 cronのような時間ベースのタスク管理が可能になります。

$ celery -A tasks beat --loglevel=info

ワーカーとBeatを同時に起動する構成が一般的です。

Celeryのメリット

  • 非同期処理に最適
  • 分散処理が可能
  • Webアプリと密接に連携できる
  • スケールアウト可能
  • 再試行・リトライ制御が可能

単なる定期実行ツールではなく、 アプリケーションレベルの処理基盤として利用できます。

Celeryの注意点

  • Brokerが必要(Redis/RabbitMQなど)
  • 構成がやや複雑
  • インフラ設計が必要
  • メモリ消費が大きくなる場合がある

小規模サーバーで単純な定期実行だけであれば、 cronやsystemd timerの方がシンプルな場合もあります。

Celeryは、 「アプリケーション連動の非同期処理」が必要な場合に 最も力を発揮します。

cron・systemd timerとの違い

  • cron: 単純な時間ベースの定期実行
  • systemd timer: systemd統合型スケジューリング
  • Celery: 分散・非同期処理基盤

Celeryは「時間実行ツール」ではなく、 アプリケーション処理基盤として理解するのが重要です。

まとめ

Celeryは、Python環境における強力な分散タスクキューです。

Webアプリケーションの応答性を維持しながら、 バックグラウンド処理を安全に実行できます。

小規模な定期実行であればcron、 systemd環境ではtimer、 アプリケーション連動や分散処理が必要であればCelery、 と用途に応じた使い分けが重要です。

Linux環境での自動化戦略を考える上で、 Celeryは非常に重要な選択肢の一つと言えるでしょう。