Heim > Artikel > Backend-Entwicklung > Asynchrone Coroutine-Entwicklungspraxis: Aufbau eines leistungsstarken Nachrichtenwarteschlangensystems
Asynchrone Coroutine-Entwicklungspraxis: Aufbau eines leistungsstarken Nachrichtenwarteschlangensystems
Mit der Entwicklung des Internets ist das Nachrichtenwarteschlangensystem zu einer Schlüsselkomponente beim Aufbau eines leistungsstarken, skalierbaren verteilten Systems geworden. Beim Aufbau eines Nachrichtenwarteschlangensystems kann die Anwendung asynchroner Coroutinen die Leistung und Skalierbarkeit des Systems effektiv verbessern. In diesem Artikel wird die praktische Entwicklung asynchroner Coroutinen am Beispiel des Aufbaus eines Hochleistungs-Nachrichtenwarteschlangensystems vorgestellt und spezifische Codebeispiele bereitgestellt.
1.1 Leichtgewicht: Asynchrone Coroutinen müssen keine zusätzlichen Threads erstellen und es muss nur eine kleine Anzahl von Coroutinen erstellt werden, um eine groß angelegte Parallelität zu erreichen. Dadurch wird der Verbrauch von Systemressourcen erheblich reduziert.
1.2 Effizienz: Asynchrone Coroutinen nutzen nicht blockierende E/A- und ereignisgesteuerte Mechanismen, um eine effiziente Aufgabenplanung und -verarbeitung mit extrem geringem Overhead zu erreichen und unterliegen nicht dem Overhead des Kontextwechsels.
1.3 Skalierbarkeit: Asynchrone Coroutinen können automatisch erweitert werden, wenn die Systemlast steigt, ohne dass Parameter wie die Thread-Pool-Größe manuell angepasst werden müssen.
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())
Im obigen Code verwenden wir eine message_queue
-Liste zum Speichern veröffentlichter Nachrichten und ein Wörterbuch--Abonnements
zum Speichern von Abonnenten und entsprechenden Kanälen. Die Funktion publish
wird zum Veröffentlichen von Nachrichten verwendet, die Funktion notify_subscribers
wird zum Benachrichtigen von Abonnenten verwendet, die Funktion subscribe
wird zum Abonnieren eines Kanals verwendet. und consumer dient als Beispielconsumer. <code>message_queue
列表来存储发布的消息,使用一个字典subscriptions
来存储订阅者和对应的通道。publish
函数用于发布消息,notify_subscribers
函数用于通知订阅者,subscribe
函数用于订阅某个通道,consumer
函数作为一个示例的消费者。
在main
函数中,我们首先使用subscribe
函数订阅了channel1
通道,并将consumer
函数指定为订阅者。然后我们使用publish
函数发布了一条消息到channel1
通道,notify_subscribers
会自动地将消息发送给订阅者。
下面是一个基于异步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())
在优化示例代码中,我们使用executor
来创建一个协程池,并通过execute
main
abonnieren wir zunächst den Kanal channel1
mit der Funktion subscribe
und geben den consumer
an Funktion für Abonnenten. Dann verwenden wir die Funktion publish
, um eine Nachricht im Kanal channel1
zu veröffentlichen, und notify_subscribers
sendet die Nachricht automatisch an die Abonnenten.
executor
, um einen Coroutine-Pool zu erstellen. Und fügen Sie die Rückruffunktion zur Ausführung über die Funktion execute
in den Coroutine-Pool ein. Dadurch können übermäßige Kontextwechsel vermieden, Rückruffunktionen gleichzeitig ausgeführt und die Nachrichtenverarbeitungsfähigkeiten verbessert werden. 🎜🎜Natürlich kann das eigentliche Nachrichtenwarteschlangensystem weiter optimiert und erweitert werden, z. B. durch Einführung von Nachrichtenpersistenz, Nachrichtenbestätigungsmechanismus, horizontaler Erweiterung usw. 🎜🎜🎜Zusammenfassung🎜Dieser Artikel stellt die praktische Entwicklung asynchroner Coroutinen am Beispiel des Aufbaus eines Hochleistungs-Nachrichtenwarteschlangensystems vor und bietet spezifische Codebeispiele. Asynchrone Coroutinen können eine effiziente Aufgabenplanung und -verarbeitung mit extrem geringem Overhead erreichen und die Systemleistung und Skalierbarkeit effektiv verbessern. Durch die Kombination von Technologien wie asynchroner E/A und Coroutine-Pools können wir das Nachrichtenwarteschlangensystem weiter optimieren und erweitern, um es an verschiedene Anwendungsszenarien und Anforderungen anzupassen. 🎜🎜Das obige ist der detaillierte Inhalt vonAsynchrone Coroutine-Entwicklungspraxis: Aufbau eines leistungsstarken Nachrichtenwarteschlangensystems. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!