Pour certaines opérations dans les applications Web, leur exécution peut prendre beaucoup de temps ou leur temps d'exécution ne peut pas être déterminé. Pour ces opérations, si l'utilisateur a seulement besoin de savoir que le serveur a reçu la requête et n'a pas besoin d'obtenir immédiatement le résultat de l'exécution de la requête, alors nous pouvons les traiter de manière asynchrone. Si l'utilisation du cache est la première chose importante pour optimiser les performances d'un site Web, alors l'asynchronisation des tâches qui prennent du temps ou dont le temps d'exécution est incertain est la deuxième chose importante pour optimiser les performances d'un site Web. En termes simples, tout ce qui peut être reporté ne doit pas être fait immédiatement.
Dans le chapitre précédent, nous avons pris comme exemples l'envoi de messages texte et le téléchargement de fichiers sur le stockage cloud. Parmi ces deux opérations, la première est une opération à temps incertain (car en tant qu'appelant, nous ne pouvons pas déterminer le temps de réponse de la plateforme tierce), et la seconde est une opération chronophage (si le fichier est volumineux ou si le la plate-forme tierce est instable, cela peut entraîner un temps de téléchargement long). Bien entendu, les deux opérations peuvent être asynchrones.
Dans les projets Python, nous pouvons utiliser le multi-threading ou utiliser la bibliothèque tierce Celery pour réaliser un traitement asynchrone.
Celery est une file d'attente de tâches/files d'attente de messages asynchrones Python, qui peut facilement terminer le traitement des tâches asynchrones. Grâce à Celery, les tâches peuvent être distribuées à plusieurs exécuteurs de tâches, qui peuvent être un seul processus, plusieurs processus ou plusieurs hôtes. Le céleri prend également en charge la priorité des tâches, la sauvegarde des résultats des tâches, la nouvelle tentative de tâche et d'autres fonctions.
Utiliser Celery pour implémenter l'asynchronisation nécessite les étapes suivantes :
Installer Celery
pip install celery
Créer une application Celery dans le projet
from celery import Celery app = Celery('tasks', broker='pyamqp://guest@localhost//')
Définir des tâches
@app.task def add(x, y): return x + y
Appeler des tâches dans le projet
result = add.delay(4, 4) print(result.get(timeout=1))
Le module threading
en Python peut être utilisé pour créer des multi-threads. Grâce au multithreading, des tâches fastidieuses peuvent être exécutées dans de nouveaux threads sans affecter l'exécution du thread principal. threading
模块可以用来创建多线程。使用多线程可以将耗时的任务放在新线程中执行,从而不会影响主线程的执行。
使用多线程实现异步化需要以下步骤:
导入 threading
模块
import threading
定义一个函数作为任务
def task(): print('Hello from task')
创建一个新线程并启动它
t = threading.Thread(target=task) t.start()
有些任务需要在特定的时间执行,这时候我们需要使用定时任务。Python 中有多个第三方库可以用来实现定时任务,如 schedule
、APScheduler
等。下面以 APScheduler
为例来讲解如何实现定时任务。
使用 APScheduler
实现定时任务需要以下步骤:
安装 APScheduler
pip install apscheduler
导入 APScheduler
模块
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 秒执行一次 task
函数。
虽然 Celery 和多线程都可以实现异步化处理,但是它们之间存在一些差异和优缺点。
优点:
可以将任务分发到多个任务执行者中,从而实现任务的负载均衡,提高任务处理的效率。
支持任务的优先级、任务结果的保存、任务的重试等功能。
支持多种消息传输协议,如 AMQP、Redis、RabbitMQ 等。
可以方便地集成到 Django、Flask 等 Web 框架中。
缺点:
安装和配置过程可能会比较繁琐。
可能会增加系统的复杂性。
优点:
实现起来比较简单,不需要安装额外的库。
可以在本地机器上快速地完成任务处理。
缺点:
不能将任务分发到多个任务执行者中,从而无法实现任务的负载均衡。
无法方便地实现任务的优先级、任务结果的保存、任务的重试等功能。
可能会导致系统的性能下降,因为多线程的并发性能有限。
在 Python 中,有多个第三方库可以用来实现定时任务,如 schedule
、APScheduler
等。这些库都有各自的优缺点,我们可以根据具体需求选择合适的库来实现定时任务。
简单易用,只需要调用 schedule
threading
rrreee
Tâches planifiéesschedule
, APScheduler
, etc. Ce qui suit utilise APScheduler
comme exemple pour expliquer comment implémenter des tâches planifiées. Utiliser APScheduler
pour implémenter des tâches planifiées nécessite les étapes suivantes : 🎜🎜Installer APScheduler
🎜🎜🎜pip install apscheduler🎜🎜🎜Importer APScheduler
module🎜rrreee 🎜Créez une instance BlockingScheduler
et ajoutez des tâches🎜rrreee🎜Le code ci-dessus exécutera la fonction task
toutes les 5 secondes. 🎜🎜Comparaison entre Celery et multi-threading🎜🎜Bien que Celery et multi-threading puissent implémenter un traitement asynchrone, il existe certaines différences, avantages et inconvénients entre eux. 🎜🎜Avantages et inconvénients du céleri🎜🎜Avantages : 🎜🎜🎜🎜Peut distribuer des tâches à plusieurs exécuteurs de tâches, réalisant ainsi un équilibrage de la charge des tâches et améliorant l'efficacité du traitement des tâches. 🎜🎜🎜🎜Prend en charge la priorité des tâches, la sauvegarde des résultats des tâches, la nouvelle tentative de tâche et d'autres fonctions. 🎜🎜🎜🎜Prend en charge plusieurs protocoles de transmission de messages, tels que AMQP, Redis, RabbitMQ, etc. 🎜🎜🎜🎜Peut être facilement intégré dans des frameworks Web tels que Django et Flask. 🎜🎜🎜🎜Inconvénients : 🎜🎜🎜🎜Le processus d'installation et de configuration peut être fastidieux. 🎜🎜🎜🎜 Peut augmenter la complexité du système. 🎜🎜🎜🎜Avantages et inconvénients du multi-threading🎜🎜Avantages : 🎜🎜🎜🎜Il est relativement simple à mettre en œuvre et ne nécessite pas l'installation de bibliothèques supplémentaires. 🎜🎜🎜🎜Peut terminer rapidement le traitement des tâches sur la machine locale. 🎜🎜🎜🎜Inconvénients : 🎜🎜🎜🎜Impossible de distribuer les tâches à plusieurs exécuteurs de tâches, ce qui rend impossible l'équilibrage de la charge des tâches. 🎜🎜🎜🎜Il n'est pas possible de mettre en œuvre facilement des tâches telles que la priorité, l'enregistrement des résultats des tâches et la nouvelle tentative de tâches. 🎜🎜🎜🎜 peut entraîner une dégradation des performances du système, car le multithreading a des performances de concurrence limitées. 🎜🎜🎜🎜Sélection des tâches planifiées🎜🎜En Python, il existe plusieurs bibliothèques tierces qui peuvent être utilisées pour implémenter des tâches planifiées, telles que schedule
, APScheduler
, etc. . Ces bibliothèques ont leurs propres avantages et inconvénients. Nous pouvons choisir la bibliothèque appropriée pour mettre en œuvre des tâches planifiées en fonction de besoins spécifiques. 🎜🎜schedule library🎜🎜🎜🎜 est simple et facile à utiliser. Il vous suffit d'appeler la fonction schedule
pour implémenter les tâches planifiées. 🎜🎜🎜🎜 ne peut pas réaliser l'équilibrage de charge des tâches et l'exécution simultanée des tâches. 🎜🎜🎜🎜Bibliothèque APScheduler🎜🎜🎜🎜 prend en charge plusieurs planificateurs, tels que BlockingScheduler, BackgroundScheduler, AsyncIOScheduler, etc. 🎜🎜🎜🎜Prend en charge plusieurs déclencheurs, tels que date, intervalle, cron, interval_from_last, etc. 🎜Prend en charge l'exécution simultanée de tâches et l'équilibrage de charge.
Peut être facilement intégré dans des frameworks Web tels que Django et Flask.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!