ホームページ  >  記事  >  バックエンド開発  >  Python Celery を学び、非同期タスクを簡単に完了します

Python Celery を学び、非同期タスクを簡単に完了します

WBOY
WBOY転載
2023-04-23 15:31:161678ブラウズ

最新の Web アプリケーションはかつてないほど高速で便利になっていますが、重いタスクをメインスレッドで作業するのではなく、システムの他の部分に転送する必要がある状況が依然として多くあります。

これらの状況の例は次のとおりです:

  • 定期タスク – 特定の間隔で実行するようにスケジュールされたジョブ。たとえば、日次レポートや月次レポートの生成などです。
  • サードパーティ ツール - アプリケーションは、他のタスクが先に完了するのを待つのではなく、すぐにユーザーに応答を返す必要があります。たとえば、電子メールや通知を送信したり、内部ツールに更新の進行状況を伝えたりします。
  • 長時間実行されるジョブ – 複雑な作業やリソースを大量に消費する作業を実行し、ユーザーがジョブが完了するまで待つ必要があるジョブ。例えば。 DAG ワークフロー、Map-Reduce ベースのタスク、長時間実行される Spark ジョブなど。

では、このような状況にどう対処すればよいのでしょうか?そんな時に役立つのがセロリです。

セロリとは何ですか?

Celery はオープン ソースのタスク キュー実装であり、多くの場合、Flask や Django などの Python ベースの Web フレームワークと組み合わせて、一般的な要求と応答のサイクルの外側でタスクを非同期に実行します。

つまり、Celery は本質的に分散メッセージングに基づくタスク キューです。実行ユニットまたはタスクは、マルチプロセッシング、gevent、またはイベントレットを使用して 1 つ以上のワーカー上で同時に実行されます。これらのタスクは、同期的に (つまり、準備ができるまで待つ) または非同期的に (つまり、バックグラウンドで) 実行できます。

轻松完成异步任务,一文搞懂Python Celery

セロリはどのように作用するのでしょうか?

Celery は、プロデューサー/コンシューマー モデルに基づいた分散タスク キューです。

タスク キューは、スレッドやマシン間で作業を分散するためのメカニズムであり、本質的にプロデューサー (Web アプリケーション) とコンシューマー (Celery ワーカー) の間のメッセージ仲介者です。

Celery はメッセージを通じて対話し、ブローカーはクライアント (プロデューサー) とワーカー (消費者) の間の仲介者として機能します。タスクを開始するには、クライアントがメッセージをキューにプッシュし、ブローカーがそのメッセージをワーカーに配信します。

Celery システムは複数のワーカーとブローカーで構成できるため、高可用性と水平拡張の可能性が得られます。

つまり、Celery クライアントはプロデューサーであり、メッセージ ブローカーを通じて新しいタスクをキューに追加します。次に、Celery ワーカーもメッセージ ブローカーを通じてキューから新しいタスクを取得します。処理が完了すると、結果は結果バックエンドに保存されます。

実際の例

次の例では、RedisMQ をメッセージ ブローカーとして使用します。

Redis のセットアップ

Linux/macOS システムで、次のコマンドを実行して、Redis サーバーをローカルで実行します。

$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ rm redis-stable.tar.gz
$ cd redis-stable
$ make

Redis をセットアップした後、次のコマンドを実行して Redis サーバーを実行します。次のコマンドを実行します:

$ redis-server

サーバーはデフォルトのポート 6379 で実行されます。

アプリケーションのセットアップ

まず、Python プロジェクトをローカルにセットアップします。

Celery は、pip や easy_install などの標準ツールを通じてインストールできます。次のコマンドを使用して Celery と Redis をインストールします:

pip install celery redis==4.3.4

アプリケーションを実行するには Celery インスタンスが必要です。タスクの作成や管理など、Celery によって実装されるタスクはインスタンスから始まります。

プロジェクト内にファイル task.py を作成します。

From celery import Celery

broker_url = 'redi://localhost:6379/0'

app = Celery('tasks',broker = broker_url)

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

ここでは、2 つの数値の合計を返す単純なタスク add() が定義されています。

Celery Worker の実行

ターミナルでプロジェクトの場所に切り替え、次のコマンドを使用して Celery Worker を実行します。

$ celery -A tasks worker - loglevel=info

Celery Worker コマンド ラインの詳細については、次を参照してください。ヘルプを使用できます:

$ celery worker - help

タスクの呼び出し

Celery では、遅延() メソッドを使用してタスクを呼び出します。

プロジェクトの別のターミナル ウィンドウを開き、次のコマンドを実行します:

$ python

これにより、Python コマンド ラインが開きます。

>> from tasks import add
>> add.delay(1,2)

これは、AsyncResult インスタンスを返します。これは、タスクのステータスの確認、戻り値の取得、タスクの完了の待機、および失敗時の例外とトレースバックの取得に使用できます。

add.lay() コマンドを実行すると、タスクはキューにプッシュされ、ワー​​カーによって取得されます。これは Celery ワーカー ターミナルで確認でき、タスクが受信され、正常に完了したことがはっきりとわかります。

以上がPython Celery を学び、非同期タスクを簡単に完了しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。