Maison développement back-end tutoriel php Pratique de développement de coroutines asynchrones : création d'un système de file d'attente de messages hautes performances

Pratique de développement de coroutines asynchrones : création d'un système de file d'attente de messages hautes performances

Dec 02, 2023 pm 12:13 PM
协程 异步 高性能

Pratique de développement de coroutines asynchrones : création dun système de file dattente de messages hautes performances

Pratique de développement de coroutines asynchrones : création d'un système de file d'attente de messages hautes performances

Avec le développement d'Internet, le système de file d'attente de messages est devenu un élément clé dans la construction d'un système distribué hautes performances et évolutif. Lors de la création d'un système de file d'attente de messages, l'application de coroutines asynchrones peut améliorer efficacement les performances et l'évolutivité du système. Cet article présentera le développement pratique de coroutines asynchrones, en prenant comme exemple la création d'un système de file d'attente de messages hautes performances, et fournira des exemples de code spécifiques.

  1. Le concept et les avantages des coroutines asynchrones
    Les coroutines asynchrones sont un modèle de programmation simultanée piloté par événements qui peut réaliser un traitement hautement simultané dans un seul thread. Par rapport au modèle multithread traditionnel, les coroutines asynchrones présentent les avantages suivants :

1.1 Légères : les coroutines asynchrones n'ont pas besoin de créer des threads supplémentaires, et seul un petit nombre de coroutines doivent être créées pour obtenir une concurrence à grande échelle. Cela réduit considérablement la consommation des ressources système.

1.2 Efficacité : les coroutines asynchrones utilisent des E/S non bloquantes et des mécanismes pilotés par les événements pour obtenir une planification et un traitement efficaces des tâches avec une surcharge extrêmement faible et ne sont pas soumises à la surcharge du changement de contexte.

1.3 Évolutivité : les coroutines asynchrones peuvent se développer automatiquement à mesure que la charge du système augmente, sans qu'il soit nécessaire d'ajuster manuellement des paramètres tels que la taille du pool de threads.

  1. Conception et mise en œuvre d'un système de file d'attente de messages
    Lors de la conception d'un système de file d'attente de messages, la première chose que nous devons prendre en compte est la structure des données de la file d'attente et le modèle producteur-consommateur du message. Les systèmes de file d'attente de messages courants utilisent généralement une structure de données premier entré, premier sorti (FIFO) et un modèle de publication-abonnement pour mettre en œuvre la transmission des messages entre les producteurs et les consommateurs. Ce qui suit est un exemple de code d'un système de file d'attente de messages simple développé sur la base de coroutines asynchrones :
import asyncio

message_queue = []
subscriptions = {}

async def publish(channel, message):
    message_queue.append((channel, message))
    await notify_subscribers()

async def notify_subscribers():
    while message_queue:
        channel, message = message_queue.pop(0)
        for subscriber in subscriptions.get(channel, []):
            asyncio.ensure_future(subscriber(message))

async def subscribe(channel, callback):
    if channel not in subscriptions:
        subscriptions[channel] = []
    
    subscriptions[channel].append(callback)

async def consumer(message):
    print("Received message:", message)

async def main():
    await subscribe("channel1", consumer)
    await publish("channel1", "hello world")

if __name__ == "__main__":
    asyncio.run(main())
Copier après la connexion

Dans le code ci-dessus, nous utilisons une liste message_queue pour stocker les messages publiés et un dictionnaire d'abonnements. pour stocker les abonnés et les chaînes correspondantes. La fonction publish permet de publier des messages, la fonction notify_subscribers permet de notifier les abonnés, la fonction subscribe permet de s'abonner à une chaîne, et consumer< La fonction /code> sert d'exemple de consommateur. <code>message_queue列表来存储发布的消息,使用一个字典subscriptions来存储订阅者和对应的通道。publish函数用于发布消息,notify_subscribers函数用于通知订阅者,subscribe函数用于订阅某个通道,consumer函数作为一个示例的消费者。

main函数中,我们首先使用subscribe函数订阅了channel1通道,并将consumer函数指定为订阅者。然后我们使用publish函数发布了一条消息到channel1通道,notify_subscribers会自动地将消息发送给订阅者。

  1. 性能优化与扩展
    为了进一步优化和扩展消息队列系统的性能,我们可以结合使用异步I/O和协程池来提高消息的处理能力。通过使用异步I/O,我们可以充分利用系统资源,提高系统的吞吐量。协程池可以用来限制并发任务数量,并避免过多的上下文切换。

下面是一个基于异步I/O和协程池的消息队列系统的优化示例代码:

import asyncio
from concurrent.futures import ThreadPoolExecutor

message_queue = []
subscriptions = {}
executor = ThreadPoolExecutor()

async def publish(channel, message):
    message_queue.append((channel, message))
    await notify_subscribers()

async def notify_subscribers():
    while message_queue:
        channel, message = message_queue.pop(0)
        for subscriber in subscriptions.get(channel, []):
            await execute(subscriber(message))

async def execute(callback):
    loop = asyncio.get_running_loop()
    await loop.run_in_executor(executor, callback)

async def subscribe(channel, callback):
    if channel not in subscriptions:
        subscriptions[channel] = []
    
    subscriptions[channel].append(callback)

async def consumer(message):
    print("Received message:", message)

async def main():
    await subscribe("channel1", consumer)
    await publish("channel1", "hello world")

if __name__ == "__main__":
    asyncio.run(main())
Copier après la connexion

在优化示例代码中,我们使用executor来创建一个协程池,并通过execute

Dans la fonction main, on s'abonne d'abord au canal channel1 en utilisant la fonction subscribe et on précise le consommateur fonction pour les abonnés. Ensuite, nous utilisons la fonction publish pour publier un message sur le canal channel1, et notify_subscribers enverra automatiquement le message aux abonnés.

    Optimisation et expansion des performances
      Afin d'optimiser et d'étendre davantage les performances du système de file d'attente de messages, nous pouvons utiliser en combinaison des E/S asynchrones et des pools de coroutines pour améliorer les capacités de traitement des messages. En utilisant les E/S asynchrones, nous pouvons utiliser pleinement les ressources du système et améliorer le débit du système. Les pools de coroutines peuvent être utilisés pour limiter le nombre de tâches simultanées et éviter des changements de contexte excessifs.

    1. Ce qui suit est un exemple de code optimisé pour un système de file d'attente de messages basé sur des E/S asynchrones et un pool de coroutines :
    rrreee🎜Dans l'exemple de code optimisé, nous utilisons exécuteur pour créer un pool de coroutines, Et placez la fonction de rappel dans le pool de coroutines pour exécution via la fonction execute. Cela peut éviter un changement de contexte excessif, exécuter des fonctions de rappel simultanément et améliorer les capacités de traitement des messages. 🎜🎜Bien sûr, dans le système de file d'attente de messages actuel, il peut être encore optimisé et étendu, par exemple en introduisant la persistance des messages, le mécanisme de confirmation des messages, l'expansion horizontale, etc. 🎜🎜🎜Résumé🎜Cet article présente le développement pratique de coroutines asynchrones, en prenant comme exemple la création d'un système de file d'attente de messages hautes performances, et fournit des exemples de code spécifiques. Les coroutines asynchrones peuvent permettre une planification et un traitement efficaces des tâches avec une surcharge extrêmement faible, et peuvent améliorer efficacement les performances et l'évolutivité du système. En combinant des technologies telles que les E/S asynchrones et les pools de coroutines, nous pouvons optimiser et étendre davantage le système de file d'attente de messages pour l'adapter aux différents scénarios et besoins d'application. 🎜🎜

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La relation parent-enfant entre les fonctions golang et goroutine La relation parent-enfant entre les fonctions golang et goroutine Apr 25, 2024 pm 12:57 PM

Il existe une relation parent-enfant entre les fonctions et les goroutines dans Go. La goroutine parent crée la goroutine enfant, et la goroutine enfant peut accéder aux variables de la goroutine parent mais pas l'inverse. Créez une goroutine enfant à l'aide du mot-clé go, et la goroutine enfant est exécutée via une fonction anonyme ou une fonction nommée. La goroutine parent peut attendre que la goroutine enfant se termine via sync.WaitGroup pour s'assurer que le programme ne se termine pas avant que toutes les goroutines enfants ne soient terminées.

Application de la concurrence et des coroutines dans la conception de l'API Golang Application de la concurrence et des coroutines dans la conception de l'API Golang May 07, 2024 pm 06:51 PM

La concurrence et les coroutines sont utilisées dans la conception GoAPI pour : Traitement hautes performances : traiter plusieurs requêtes simultanément pour améliorer les performances. Traitement asynchrone : utilisez des coroutines pour traiter des tâches (telles que l'envoi d'e-mails) de manière asynchrone, libérant ainsi le thread principal. Traitement des flux : utilisez des coroutines pour traiter efficacement les flux de données (tels que les lectures de bases de données).

La relation entre la coroutine Golang et la goroutine La relation entre la coroutine Golang et la goroutine Apr 15, 2024 am 10:42 AM

Coroutine est un concept abstrait permettant d'exécuter des tâches simultanément, et goroutine est une fonction de thread légère dans le langage Go qui implémente le concept de coroutine. Les deux sont étroitement liés, mais la consommation des ressources des goroutines est moindre et gérée par le planificateur Go. Goroutine est largement utilisé dans les combats réels, comme le traitement simultané des requêtes Web et l'amélioration des performances des programmes.

Comment contrôler le cycle de vie des coroutines Golang ? Comment contrôler le cycle de vie des coroutines Golang ? May 31, 2024 pm 06:05 PM

Le cycle de vie de la coroutine Go peut être contrôlé des manières suivantes : Créer une coroutine : utilisez le mot-clé go pour démarrer une nouvelle tâche. Terminez les coroutines : attendez que toutes les coroutines soient terminées, utilisez sync.WaitGroup. Utilisez les signaux de fermeture de canal. Utilisez le contexte context.Context.

Guide avancé de Python asyncio : du débutant à l'expert Guide avancé de Python asyncio : du débutant à l'expert Mar 04, 2024 am 09:43 AM

Programmation simultanée et asynchrone La programmation simultanée traite de plusieurs tâches s'exécutant simultanément, la programmation asynchrone est un type de programmation simultanée dans laquelle les tâches ne bloquent pas les threads. asyncio est une bibliothèque de programmation asynchrone en python, qui permet aux programmes d'effectuer des opérations d'E/S sans bloquer le thread principal. Boucle d'événements Le cœur d'asyncio est la boucle d'événements, qui surveille les événements d'E/S et planifie les tâches correspondantes. Lorsqu'une coroutine est prête, la boucle d'événements l'exécute jusqu'à ce qu'elle attende les opérations d'E/S. Il met ensuite la coroutine en pause et continue d'exécuter d'autres coroutines. Coroutines Les coroutines sont des fonctions qui peuvent suspendre et reprendre l'exécution. Le mot-clé asyncdef est utilisé pour créer des coroutines. La coroutine utilise le mot-clé wait pour attendre la fin de l'opération d'E/S. Les bases suivantes d'asyncio

Technologie asynchrone et non bloquante dans la gestion des exceptions Java Technologie asynchrone et non bloquante dans la gestion des exceptions Java May 01, 2024 pm 05:42 PM

Des techniques asynchrones et non bloquantes peuvent être utilisées pour compléter la gestion traditionnelle des exceptions, permettant la création d'applications Java plus réactives et efficaces : Gestion des exceptions asynchrones : gestion des exceptions dans un autre thread ou processus, permettant au thread principal de continuer à s'exécuter, évitant ainsi le blocage. Gestion des exceptions non bloquantes : implique la gestion des exceptions pilotées par les événements lorsqu'une opération d'E/S se déroule mal, évitant ainsi le blocage des threads et permettant à la boucle d'événements de gérer les exceptions.

La création et le cycle de vie des coroutines Golang La création et le cycle de vie des coroutines Golang Apr 15, 2024 pm 05:06 PM

Une coroutine est un thread léger qui réutilise les unités d'exécution dans la même pile d'appels en commutant explicitement. Son cycle de vie comprend la création, l'exécution, la suspension, la récupération et l'achèvement. Utilisez le mot-clé go pour créer une coroutine, qui peut être utilisée pour des calculs parallèles (tels que le calcul de la séquence de Fibonacci) en combat réel.

Comment utiliser les coroutines Go pour implémenter le traitement parallèle ? Comment utiliser les coroutines Go pour implémenter le traitement parallèle ? Jun 05, 2024 pm 06:07 PM

Comment utiliser les coroutines Go pour implémenter le traitement parallèle ? Créez une coroutine pour calculer la séquence de Fibonacci en parallèle. Les coroutines transfèrent les données via des canaux pour réaliser un calcul parallèle. La coroutine principale reçoit et traite les résultats des calculs parallèles.

See all articles