Maison  >  Article  >  développement back-end  >  Comment utiliser les tâches asynchrones et planifiées de Python pour améliorer la simultanéité des programmes et l'efficacité d'exécution ?

Comment utiliser les tâches asynchrones et planifiées de Python pour améliorer la simultanéité des programmes et l'efficacité d'exécution ?

WBOY
WBOYavant
2023-05-09 17:25:161086parcourir

Tâches asynchrones et tâches planifiées

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.

Utilisez Celery pour réaliser l'asynchronisation

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))

Utilisez plusieurs -threading Implémentation de l'asynchronousisation

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 中有多个第三方库可以用来实现定时任务,如 scheduleAPScheduler 等。下面以 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和多线程的比较

虽然 Celery 和多线程都可以实现异步化处理,但是它们之间存在一些差异和优缺点。

Celery的优缺点

优点:

  • 可以将任务分发到多个任务执行者中,从而实现任务的负载均衡,提高任务处理的效率。

  • 支持任务的优先级、任务结果的保存、任务的重试等功能。

  • 支持多种消息传输协议,如 AMQP、Redis、RabbitMQ 等。

  • 可以方便地集成到 Django、Flask 等 Web 框架中。

缺点:

  • 安装和配置过程可能会比较繁琐。

  • 可能会增加系统的复杂性。

多线程的优缺点

优点:

  • 实现起来比较简单,不需要安装额外的库。

  • 可以在本地机器上快速地完成任务处理。

缺点:

  • 不能将任务分发到多个任务执行者中,从而无法实现任务的负载均衡。

  • 无法方便地实现任务的优先级、任务结果的保存、任务的重试等功能。

  • 可能会导致系统的性能下降,因为多线程的并发性能有限。

定时任务的选择

在 Python 中,有多个第三方库可以用来实现定时任务,如 scheduleAPScheduler 等。这些库都有各自的优缺点,我们可以根据具体需求选择合适的库来实现定时任务。

schedule库

  • 简单易用,只需要调用 schedule

    Implémenter l'asynchronisation en multi-threading nécessite les étapes suivantes :
  • Importer le module threading

  • importer le threading

Définir une fonction en tant que tâche
    rrreee
  • Créer un nouveau thread et le démarrer

    rrreee

    Tâches planifiées
  • Certaines tâches doivent être exécutées à une heure précise. À ce moment-là, nous devons utiliser des tâches planifiées. Il existe plusieurs bibliothèques tierces dans Python qui peuvent être utilisées pour implémenter des tâches planifiées, telles que schedule, 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer