いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「PythonでCeleryを使って非同期タスクキューを実装する方法を知りたい」とお考えではありませんか?
Webアプリケーションでメール送信や画像処理など、時間のかかる処理をリクエストの中で直接実行すると、レスポンスが遅くなってしまいます。
Celeryを使えば、時間のかかる処理をバックグラウンドのワーカーに任せて、レスポンスを高速に保つことが可能です。



手順はシンプルなので、サクッと解説します。
ということで、本記事ではPythonでCeleryを使って非同期タスクキューを実装する方法を解説します。



すぐ読み終わるので、ぜひ最後まで読んでくださいませ。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【Python】Celeryで非同期タスクキューを実装する方法
早速ですが、PythonでCeleryを使った非同期タスクキューの実装方法を解説します。
Celeryのインストールと準備
まずは、Celeryを動かすための準備をします。
Celeryはタスクの受け渡しにブローカーを使います。
本記事では、ブローカーと結果保存の両方にRedisを使う構成で進めます。
docker run -d -p 6379:6379 redis:7pipコマンドで、Celery本体とRedis用のクライアントライブラリをインストールします。
pip install celery redisCeleryアプリケーションとタスクの実装
準備ができたら、Celeryアプリケーションとタスクを実装します。
tasks.pyというファイルを作成し、Celeryインスタンスを定義します。
from celery import Celery
app = Celery(
"tasks",
broker="redis://localhost:6379/0",
backend="redis://localhost:6379/0",
)broker引数には、タスクの送信先を指定します。
backend引数には、実行結果の保存先を指定します。
app.taskデコレータを付けた関数が、そのままCeleryのタスクになります。
@app.task
def send_email_task(to_address, subject):
print(f"send mail to {to_address}: {subject}")
return "sent"


重い処理や時間のかかる処理を、app.taskデコレータで囲むだけでタスク化できます。
delayメソッドを使うと、タスクをキューに送信してすぐに処理を返せます。
from tasks import send_email_task
result = send_email_task.delay("user@example.com", "登録完了のお知らせ")
print(result.id)実行のタイミングやオプションを細かく指定したい場合は、apply_asyncメソッドを使います。
send_email_task.apply_async(
args=("user@example.com", "登録完了のお知らせ"),
countdown=10,
)countdown引数に秒数を渡すと、指定した秒数だけ実行を遅らせられます。
ワーカーの起動と実行結果の確認
タスクを定義しただけでは処理は実行されないので、ワーカーを起動します。
ターミナルでワーカー起動コマンドを実行します。
celery -A tasks worker --loglevel=infoワーカーが起動すると、キューに送信されたタスクを順番に処理していきます。
AsyncResultクラスを使うと、タスクIDから実行状況を取得できます。
from celery.result import AsyncResult
from tasks import app
result = AsyncResult(task_id, app=app)
print(result.status)
print(result.result)statusプロパティで、PENDING・STARTED・SUCCESS・FAILUREといった状態を確認できます。



ワーカーを止めた状態でdelayメソッドを呼んでも、Redisにタスクが溜まるだけで処理はされません。
動作確認をするときは、ワーカーが起動しているか必ず確認してください。
リトライとタイムアウトの設定
外部APIへのアクセスなど、失敗する可能性がある処理には、リトライとタイムアウトの設定を追加します。
@app.task(
bind=True,
autoretry_for=(Exception,),
retry_backoff=True,
retry_kwargs={"max_retries": 3},
time_limit=30,
soft_time_limit=25,
)
def fetch_external_data(self, url):
response = requests.get(url, timeout=10)
response.raise_for_status()
return response.json()autoretry_for引数に例外クラスを指定すると、例外発生時に自動でリトライされます。
retry_backoff引数をTrueにすると、リトライ間隔が指数関数的に伸びていきます。
time_limit引数とsoft_time_limit引数で、タスクの実行時間に上限を設けられます。



Flowerという監視ツールを使うと、ブラウザ上でタスクの実行状況やワーカーの稼働状況を確認できます。
本番運用する場合は、導入を検討する価値があります。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【厳選】フリーランスエンジニアにおすすめなエージェント3選


フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。
僕が実際に利用しているおすすめエージェントを紹介しますね。



エージェントは必ず複数登録してください。
担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…
僕は実際に5つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- IT案件に特化したフリーランスエージェント。
- 週2〜3日の案件が豊富。
- リモート案件が多く、直エンドなので単価も高い。
※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。
ITプロパートナーズ
![]()
![]()
週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。



週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。
とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!
よくある質問
CeleryとRQ(Redis Queue)はどう違いますか?
RQはシンプルさを重視した非同期タスクキューライブラリです。
Celeryは複数のブローカーに対応し、リトライやスケジューリングなど機能が豊富な点が特徴です。
要件が複雑になりそうな場合は、Celeryを選ぶと拡張しやすくなります。
ワーカーを複数起動して並列処理できますか?
concurrency引数を指定すると、1つのワーカープロセス内で複数のタスクを並列実行できます。
celery -A tasks worker --loglevel=info --concurrency=4サーバーを分けて、複数のワーカーを起動することも可能です。
定期実行したいタスクがある場合はどうすればいいですか?
Celery Beatというスケジューラを使うと、cronのような定期実行タスクを設定できます。
beat_scheduleにタスク名と実行間隔を登録し、celery -A tasks beatコマンドでスケジューラを起動します。
まとめ
今回は、PythonでCeleryを使って非同期タスクキューを実装する方法について解説しました。
以下が本記事のまとめになります。
- おすすめ本
Pythonの勉強なら「独習Python



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。









