ホームページ  >  記事  >  バックエンド開発  >  Python の非同期タスクとスケジュールされたタスクを使用して、プログラムの同時実行性と実行効率を向上させるにはどうすればよいですか?

Python の非同期タスクとスケジュールされたタスクを使用して、プログラムの同時実行性と実行効率を向上させるにはどうすればよいですか?

WBOY
WBOY転載
2023-05-09 17:25:161078ブラウズ

非同期タスクとスケジュールされたタスク

Web アプリケーションの一部の操作では、完了までに時間がかかる場合や、実行時間が特定できない場合があります。これらの操作について、ユーザーがサーバーがリクエストを受信したことだけを知り、リクエストの実行結果をすぐに取得する必要がない場合は、非同期で処理できます。 Web サイトのパフォーマンスを最適化するためにキャッシュを使用することが最初に重要である場合、時間のかかるタスクや実行時間が不確実なタスクを非同期化することは、Web サイトのパフォーマンスを最適化するために 2 番目に重要です。簡単に言えば、延期できるものはすぐに実行すべきではありません。

前の章では、例としてテキスト メッセージの送信とクラウド ストレージへのファイルのアップロードを取り上げました。これら 2 つの操作のうち、前者は時間が不確実な操作 (呼び出し側としてサードパーティ プラットフォームの応答時間を判断できないため)、後者は時間のかかる操作 (ファイルが大きいか、ファイルが大きい場合) です。サードパーティのプラットフォームが不安定なため、アップロードに時間がかかる可能性があります)。明らかに、両方の操作を非同期にすることができます。

Python プロジェクトでは、マルチスレッドを使用するか、サードパーティ ライブラリ Celery を使用して非同期処理を実現できます。

Celery を使用して非同期化を実現する

Celery は、非同期タスクの処理を簡単に完了できる Python の非同期タスク キュー/メッセージ キューです。 Celery を使用すると、タスクを複数のタスク実行者 (単一のプロセス、複数のプロセス、または複数のホスト) に分散できます。 Celery は、タスクの優先順位、タスク結果の保存、タスクの再試行などの機能もサポートしています。

Celery を使用して非同期化を実装するには、次の手順が必要です。

Celery をインストールする

pip install celery

Celery をプロジェクト アプリケーション

from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')

タスクの定義

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

プロジェクト内のタスクの呼び出し

result = add.delay(4, 4)
print(result.get(timeout=1))

マルチスレッドを使用して非同期を実現

スレッド## Python # モジュールを使用してマルチスレッドを作成できます。マルチスレッドを使用すると、メインスレッドの実行に影響を与えることなく、時間のかかるタスクを新しいスレッドで実行できます。

マルチスレッドを使用して非同期化を実装するには、次の手順が必要です。

Import

threading module

import threading

関数をタスクとして定義する

def task():
    print('Hello from task')

新しいスレッドを作成して開始

t = threading.Thread(target=task)
t.start()

タイミングタスク

いくつかのタスクは特定の時間に実行する必要があります。タイミングタスクを使用する必要があります。 Python には、

scheduleAPScheduler など、スケジュールされたタスクの実装に使用できる複数のサードパーティ ライブラリがあります。 APScheduler を例として、スケジュールされたタスクを実装する方法を説明します。

APScheduler を使用するには、スケジュールされたタスクを実装するために次の手順が必要です:

インストール

APScheduler

pip install apscheduler

Import

APScheduler Module

from apscheduler.schedulers.blocking import BlockingScheduler

BlockingScheduler インスタンスを作成し、タスクを追加

def task():
    print('Hello from task')
scheduler = BlockingScheduler()
scheduler.add_job(task, 'interval', seconds=5)
scheduler.start()

上記のコードが実行されます5 秒ごと

タスク関数。

Celery とマルチスレッドの比較

Celery とマルチスレッドはどちらも非同期処理を実装できますが、両者の間にはいくつかの違い、利点、欠点があります。

Celery のメリットとデメリット

メリット:

  • タスクを複数のタスク実行者に分散できるため、タスクの負荷分散が実現し、タスク処理の効率が向上します。 。

  • タスクの優先順位、タスク結果の保存、タスクのリトライなどの機能をサポートします。

  • AMQP、Redis、RabbitMQ などの複数のメッセージ送信プロトコルをサポートします。

  • Django や Flask などの Web フレームワークに簡単に統合できます。

欠点:

  • インストールと構成のプロセスが面倒になる可能性があります。

  • システムが複雑になる可能性があります。

マルチスレッドの長所と短所

利点:

  • 実装は比較的簡単で、追加のライブラリのインストール。

  • ローカル マシン上でタスク処理を迅速に完了できます。

欠点:

  • タスクを複数のタスク実行者に分散できないため、タスクの負荷分散を実現できません。

  • タスクの優先度、タスク結果の保存、タスクのリトライなどの機能は簡単に実装できません。

  • マルチスレッドでは同時実行パフォーマンスが制限されているため、システムのパフォーマンスが低下する可能性があります。

スケジュールされたタスクの選択

Python には、

schedule など、スケジュールされたタスクの実装に使用できる複数のサードパーティ ライブラリがあります。 、APScheduler など。これらのライブラリには独自の長所と短所があり、特定のニーズに応じてスケジュールされたタスクを実装するために適切なライブラリを選択できます。

スケジュール ライブラリ

  • はシンプルで使いやすく、スケジュールされたタスクを実装するには

    schedule 関数を呼び出すだけです。

  • タスクの負荷分散とタスクの同時実行を実現できません。

APScheduler ライブラリ

  • BlockingScheduler、BackgroundScheduler、AsyncIOScheduler などの複数のスケジューラをサポートします。

  • 日付、間隔、cron、interval_from_last などの複数のトリガーをサポートします。

  • タスクの同時実行と負荷分散をサポートします。

  • Django や Flask などの Web フレームワークに簡単に統合できます。

以上がPython の非同期タスクとスケジュールされたタスクを使用して、プログラムの同時実行性と実行効率を向上させるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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