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

王林
Libérer: 2023-12-02 12:14:02
original
1195 Les gens l'ont consulté

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!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal