Inhaltsverzeichnis
1.threading+Queue-Implementierung Thread-Warteschlange
2. Mehrere Warteschlangen
2. Redundanz
3. Skalierbarkeit
4. Flexibilität und maximale Verarbeitungskapazität
5. Wiederherstellbarkeit
6. Zustellungsgarantie
7. Bestellgarantien
8. Pufferung
9. Datenfluss verstehen
10. Asynchrone Kommunikation
Heim Backend-Entwicklung Python-Tutorial Analysieren Sie die Python-Implementierung der MQ-Nachrichtenwarteschlange und die Vorteile der Nachrichtenwarteschlange

Analysieren Sie die Python-Implementierung der MQ-Nachrichtenwarteschlange und die Vorteile der Nachrichtenwarteschlange

Aug 16, 2017 pm 01:37 PM
python 消息 队列

Die Erhaltungsrolle der Nachrichtenwarteschlange (MQ, Message Queue) bei der Nachrichtendatenübertragung bietet Garantie für die Datenkommunikation und Komfort für die Echtzeitverarbeitung. Hier werfen wir einen Blick auf die MQ-Nachrichtenwarteschlangen-Implementierung von Threads in Python und Nachrichtenwarteschlange Vorteilsanalyse

„Nachrichtenwarteschlange“ ist ein Container, der Nachrichten während ihrer Übertragung speichert. Der Nachrichtenwarteschlangenmanager fungiert als Vermittler bei der Weiterleitung von Nachrichten von seiner Quelle an sein Ziel. Der Hauptzweck einer Warteschlange besteht darin, das Routing bereitzustellen und die Zustellung von Nachrichten zu gewährleisten. Wenn der Empfänger zum Zeitpunkt des Sendens der Nachricht nicht verfügbar ist, behält Message Queue die Nachricht bei, bis sie erfolgreich zugestellt werden kann. Ich glaube, dass die Nachrichtenwarteschlange eine entscheidende Komponente für jede Architektur oder Anwendung ist. Hier sind zehn Gründe:

Beispiel für eine Python-Nachrichtenwarteschlange:

1.threading+Queue-Implementierung Thread-Warteschlange

#!/usr/bin/env python
 
import Queue
import threading
import time
 
queue = Queue.Queue()
 
class ThreadNum(threading.Thread):
 """没打印一个数字等待1秒,并发打印10个数字需要多少秒?"""
 def __init__(self, queue):
  threading.Thread.__init__(self)
  self.queue = queue
 
 def run(self):
  whileTrue:
   #消费者端,从队列中获取num
   num = self.queue.get()
   print "i'm num %s"%(num)
   time.sleep(1)
   #在完成这项工作之后,使用 queue.task_done() 函数向任务已经完成的队列发送一个信号
   self.queue.task_done()
 
start = time.time()
def main():
 #产生一个 threads pool, 并把消息传递给thread函数进行处理,这里开启10个并发
 for i in range(10):
  t = ThreadNum(queue)
  t.setDaemon(True)
  t.start()
  
 #往队列中填错数据 
 for num in range(10):
   queue.put(num)
 #wait on the queue until everything has been processed
 queue.join()
 
main()
print "Elapsed Time: %s" % (time.time() - start)
Nach dem Login kopieren

Laufergebnisse:

i'm num 0
i'm num 1
i'm num 2
i'm num 3
i'm num 4
i'm num 5
i'm num 6
i'm num 7
i'm num 8
i'm num 9
Elapsed Time: 1.01399993896
Nach dem Login kopieren

Interpretation:

Die spezifischen Arbeitsschritte werden wie folgt beschrieben:

1, erstellen Sie eine Queue.Queue () und füllen Sie sie aus es mit Daten.

2, übergeben Sie die gefüllte Dateninstanz an die Thread-Klasse, die durch Erben von threading.Thread erstellt wird.

3. Generieren Sie einen Daemon-Thread-Pool.

4. Nehmen Sie jedes Mal ein Element aus der Warteschlange und verwenden Sie die Daten- und Ausführungsmethode in diesem Thread, um die entsprechende Arbeit auszuführen.

5. Verwenden Sie nach Abschluss dieser Arbeit die Funktion queue.task_done(), um ein Signal an die Warteschlange zu senden, dass die Aufgabe abgeschlossen wurde.

6. Das Ausführen einer Verknüpfungsoperation für die Warteschlange bedeutet tatsächlich, zu warten, bis die Warteschlange leer ist, bevor das Hauptprogramm beendet wird.

Bei Verwendung dieses Modus ist Folgendes zu beachten: Wenn Sie den Daemon-Thread auf „True“ setzen, wird das Programm nach der Ausführung automatisch beendet. Der Vorteil besteht darin, dass Sie einen Join-Vorgang für die Warteschlange durchführen oder warten können, bis die Warteschlange leer ist, bevor Sie sie verlassen.

2. Mehrere Warteschlangen

Die sogenannten Mehrfachwarteschlangen, die Ausgabe einer Warteschlange kann als Eingabe einer anderen Warteschlange verwendet werden

#!/usr/bin/env python
import Queue
import threading
import time
 
queue = Queue.Queue()
out_queue = Queue.Queue()
 
class ThreadNum(threading.Thread):
  def __init__(self, queue, out_queue):
    threading.Thread.__init__(self)
    self.queue = queue
    self.out_queue = out_queue
 
  def run(self):
    whileTrue:
      #从队列中取消息
      num = self.queue.get()
      bkeep = num
      
      #将bkeep放入队列中
      self.out_queue.put(bkeep)
 
      #signals to queue job is done
      self.queue.task_done()
 
class PrintLove(threading.Thread):
  def __init__(self, out_queue):
    threading.Thread.__init__(self)
    self.out_queue = out_queue
 
  def run(self):
    whileTrue:
      #从队列中获取消息并赋值给bkeep
      bkeep = self.out_queue.get()  
      keke = "I love " + str(bkeep)
      print keke,
      print self.getName()
      time.sleep(1)
 
      #signals to queue job is done
      self.out_queue.task_done()
 
start = time.time()
def main():
  #populate queue with data
  for num in range(10):
    queue.put(num)
    
  #spawn a pool of threads, and pass them queue instance
  for i in range(5):
    t = ThreadNum(queue, out_queue)
    t.setDaemon(True)
    t.start()
 
 
  for i in range(5):
    pl = PrintLove(out_queue)
    pl.setDaemon(True)
    pl.start()
 
  #wait on the queue until everything has been processed
  queue.join()
  out_queue.join()
 
main()
print "Elapsed Time: %s" % (time.time() - start)
Nach dem Login kopieren

Laufergebnisse:

I love 0 Thread-6
I love 1 Thread-7
I love 2 Thread-8
I love 3 Thread-9
I love 4 Thread-10
I love 5 Thread-7
I love 6 Thread-6
I love 7 Thread-9
I love 8 Thread-8
I love 9 Thread-10
Elapsed Time: 2.00300002098
Nach dem Login kopieren

Interpretation:

ThreadNum-Klassenworkflow

Warteschlange definieren--->Threading erben---->Initialisieren queue-- -->Definieren Sie die Ausführungsfunktion--->holen Sie die Daten in der Warteschlange---->Verarbeiten Sie die Daten---->stellen Sie die Daten in eine andere Warteschlange-->Senden Sie ein Signal in die Warteschlange, um der Warteschlange mitzuteilen, dass die Verarbeitung abgeschlossen ist

Hauptfunktionsworkflow:

---> Daten in die benutzerdefinierte Warteschlange werfen

---> Die for-Schleife soll gestartet werden. Anzahl der Threads----> Instanziieren Sie die ThreadNum-Klasse. Starten Sie den Thread und richten Sie den Guard ein. > Die for-Schleife bestimmt die Anzahl der gestarteten Threads ----> PrintLove-Klasse instanziieren ---> Warteschlange, die verarbeitet werden soll, und führen Sie dann den Join aus. Das heißt, beenden Sie das Hauptprogramm.

Nachdem wir die allgemeine Implementierung von MQ verstanden haben, fassen wir die Vorteile von Nachrichtenwarteschlangen zusammen:

1. Entkopplung

Sagen Sie zu Beginn des Projekts die zukünftigen Projektrisiken voraus Es ist äußerst schwierig, das zu finden, was benötigt wird. Die Nachrichtenwarteschlange fügt mitten im Verarbeitungsprozess eine implizite, datenbasierte Schnittstellenschicht ein, und die Verarbeitungsprozesse auf beiden Seiten müssen diese Schnittstelle implementieren. Dies ermöglicht es Ihnen, die Prozesse auf beiden Seiten unabhängig voneinander zu erweitern oder zu ändern, solange sie die gleichen Schnittstellenbeschränkungen einhalten.

2. Redundanz

Manchmal schlägt der Prozess bei der Datenverarbeitung fehl. Sofern die Daten nicht dauerhaft gespeichert werden, gehen sie für immer verloren. Message Queuing vermeidet das Risiko eines Datenverlusts, indem Daten so lange gespeichert werden, bis sie vollständig verarbeitet wurden. Im „Insert-Get-Delete“-Paradigma, das von vielen Nachrichtenwarteschlangen verwendet wird, muss Ihr Verarbeitungsprozess vor dem Löschen einer Nachricht aus der Warteschlange klar angeben, dass die Nachricht verarbeitet wurde, um sicherzustellen, dass Ihre Daten sicher sind. Speichern Sie sie, bis Sie sie löschen. Ich bin damit fertig.

3. Skalierbarkeit

Da die Nachrichtenwarteschlange Ihre Verarbeitung entkoppelt, ist es einfach, die Häufigkeit der Nachrichteneinreihung und -verarbeitung zu erhöhen; Es besteht keine Notwendigkeit, den Code zu ändern oder Parameter anzupassen. Das Erweitern ist so einfach wie das Hochdrehen des Netzschalters.

4. Flexibilität und maximale Verarbeitungskapazität

Wenn sich Ihre Anwendung auf der Homepage von Hacker News befindet, werden Sie feststellen, dass der Datenverkehr ein ungewöhnliches Niveau erreicht hat. Ihre Anwendung muss weiterhin funktionieren, wenn die Anzahl der Besuche dramatisch ansteigt. Solche Datenverkehrsspitzen sind jedoch ungewöhnlich. Es wäre eine enorme Verschwendung, Ressourcen in den Standby-Modus zu investieren, wenn man davon ausgeht, dass solche Spitzenbesuche bewältigt werden können. Durch die Verwendung von Nachrichtenwarteschlangen können kritische Komponenten einem erhöhten Zugriffsdruck standhalten, ohne aufgrund überlasteter Anforderungen vollständig zusammenzubrechen. Weitere Informationen hierzu finden Sie in unserem Blogbeitrag zu Spitzenverarbeitungskapazitäten.

5. Wiederherstellbarkeit

Wenn einige Komponenten des Systems ausfallen, hat dies keine Auswirkungen auf das gesamte System. Die Nachrichtenwarteschlange reduziert die Kopplung zwischen Prozessen. Selbst wenn ein Prozess, der Nachrichten verarbeitet, hängen bleibt, können die zur Warteschlange hinzugefügten Nachrichten nach der Systemwiederherstellung weiterhin verarbeitet werden. Die Möglichkeit, Anfragen erneut zu versuchen oder zurückzustellen, macht oft den Unterschied zwischen einem leicht unbequemen Benutzer und einem frustrierten Benutzer aus.

6. Zustellungsgarantie

Der von der Nachrichtenwarteschlange bereitgestellte Redundanzmechanismus stellt sicher, dass die Nachricht tatsächlich verarbeitet werden kann, solange ein Prozess die Warteschlange liest. Auf dieser Basis gewährt IronMQ eine „Lieferung nur einmal“-Garantie. Unabhängig davon, wie viele Prozesse Daten aus der Warteschlange empfangen, kann jede Nachricht nur einmal verarbeitet werden. Dies ist möglich, weil beim Abrufen einer Nachricht die Nachricht einfach „abonniert“ und sie vorübergehend aus der Warteschlange entfernt wird. Sofern der Client nicht ausdrücklich angibt, dass er die Verarbeitung der Nachricht abgeschlossen hat, wird die Nachricht zurück in die Warteschlange gestellt und kann nach einer konfigurierbaren Zeitspanne erneut verarbeitet werden.

7. Bestellgarantien

In vielen Fällen ist die Reihenfolge, in der Daten verarbeitet werden, wichtig. Die Nachrichtenwarteschlange ist von Natur aus sortiert und kann garantieren, dass Daten in einer bestimmten Reihenfolge verarbeitet werden. IronMO stellt sicher, dass Nachrichten in der FIFO-Reihenfolge (First In, First Out) verarbeitet werden, sodass die Position der Nachrichten in der Warteschlange die Position ist, von der sie abgerufen wurden.

8. Pufferung

In jedem wichtigen System gibt es Elemente, die unterschiedliche Verarbeitungszeiten erfordern. Das Laden eines Bildes nimmt beispielsweise weniger Zeit in Anspruch als das Anwenden eines Filters. Nachrichtenwarteschlangen verwenden eine Pufferschicht, um die effiziente Ausführung von Aufgaben zu ermöglichen – Schreibvorgänge in die Warteschlange werden so schnell wie möglich verarbeitet, ohne durch die vorbereitende Verarbeitung zum Lesen aus der Warteschlange eingeschränkt zu werden. Diese Pufferung hilft, die Geschwindigkeit zu steuern und zu optimieren, mit der Daten durch das System fließen.

9. Datenfluss verstehen

In einem verteilten System ist es eine große Herausforderung, einen Gesamteindruck darüber zu bekommen, wie lange Benutzervorgänge dauern werden und warum. Nachrichtenserien können dabei helfen, leistungsschwache Prozesse oder Bereiche anhand der Häufigkeit der Nachrichtenverarbeitung zu identifizieren, in denen der Datenfluss nicht ausreichend optimiert ist.

10. Asynchrone Kommunikation

Oft möchte oder muss man Nachrichten nicht sofort verarbeiten. Nachrichtenwarteschlangen bieten einen asynchronen Verarbeitungsmechanismus, der es Ihnen ermöglicht, eine Nachricht in die Warteschlange zu stellen, sie jedoch nicht sofort zu verarbeiten. Sie können so viele Nachrichten in die Warteschlange stellen, wie Sie möchten, und diese dann bearbeiten, wenn Ihnen danach ist.

Das obige ist der detaillierte Inhalt vonAnalysieren Sie die Python-Implementierung der MQ-Nachrichtenwarteschlange und die Vorteile der Nachrichtenwarteschlange. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Python: Spiele, GUIs und mehr Python: Spiele, GUIs und mehr Apr 13, 2025 am 12:14 AM

Python zeichnet sich in Gaming und GUI -Entwicklung aus. 1) Spielentwicklung verwendet Pygame, die Zeichnungen, Audio- und andere Funktionen bereitstellt, die für die Erstellung von 2D -Spielen geeignet sind. 2) Die GUI -Entwicklung kann Tkinter oder Pyqt auswählen. Tkinter ist einfach und einfach zu bedienen. PYQT hat reichhaltige Funktionen und ist für die berufliche Entwicklung geeignet.

PHP und Python: Vergleich von zwei beliebten Programmiersprachen PHP und Python: Vergleich von zwei beliebten Programmiersprachen Apr 14, 2025 am 12:13 AM

PHP und Python haben jeweils ihre eigenen Vorteile und wählen nach den Projektanforderungen. 1.PHP ist für die Webentwicklung geeignet, insbesondere für die schnelle Entwicklung und Wartung von Websites. 2. Python eignet sich für Datenwissenschaft, maschinelles Lernen und künstliche Intelligenz mit prägnanter Syntax und für Anfänger.

Wie Debian Readdir sich in andere Tools integriert Wie Debian Readdir sich in andere Tools integriert Apr 13, 2025 am 09:42 AM

Die Readdir -Funktion im Debian -System ist ein Systemaufruf, der zum Lesen des Verzeichnisgehalts verwendet wird und häufig in der C -Programmierung verwendet wird. In diesem Artikel wird erläutert, wie Readdir in andere Tools integriert wird, um seine Funktionalität zu verbessern. Methode 1: Kombinieren Sie C -Sprachprogramm und Pipeline zuerst ein C -Programm, um die Funktion der Readdir aufzurufen und das Ergebnis auszugeben:#include#include#includeIntmain (intargc, char*argv []) {Dir*Dir; structDirent*Eintrag; if (argc! = 2) {{

Python und Zeit: Machen Sie das Beste aus Ihrer Studienzeit Python und Zeit: Machen Sie das Beste aus Ihrer Studienzeit Apr 14, 2025 am 12:02 AM

Um die Effizienz des Lernens von Python in einer begrenzten Zeit zu maximieren, können Sie Pythons DateTime-, Zeit- und Zeitplanmodule verwenden. 1. Das DateTime -Modul wird verwendet, um die Lernzeit aufzuzeichnen und zu planen. 2. Das Zeitmodul hilft, die Studie zu setzen und Zeit zu ruhen. 3. Das Zeitplanmodul arrangiert automatisch wöchentliche Lernaufgaben.

Nginx SSL -Zertifikat -Aktualisierung Debian Tutorial Nginx SSL -Zertifikat -Aktualisierung Debian Tutorial Apr 13, 2025 am 07:21 AM

In diesem Artikel werden Sie begleitet, wie Sie Ihr NginXSSL -Zertifikat auf Ihrem Debian -System aktualisieren. Schritt 1: Installieren Sie zuerst CertBot und stellen Sie sicher, dass Ihr System Certbot- und Python3-CertBot-Nginx-Pakete installiert hat. If not installed, please execute the following command: sudoapt-getupdatesudoapt-getinstallcertbotpython3-certbot-nginx Step 2: Obtain and configure the certificate Use the certbot command to obtain the Let'sEncrypt certificate and configure Nginx: sudocertbot--nginx Follow the prompts to select

So konfigurieren Sie den HTTPS -Server in Debian OpenSSL So konfigurieren Sie den HTTPS -Server in Debian OpenSSL Apr 13, 2025 am 11:03 AM

Das Konfigurieren eines HTTPS -Servers auf einem Debian -System umfasst mehrere Schritte, einschließlich der Installation der erforderlichen Software, der Generierung eines SSL -Zertifikats und der Konfiguration eines Webservers (z. B. Apache oder NGINX) für die Verwendung eines SSL -Zertifikats. Hier ist eine grundlegende Anleitung unter der Annahme, dass Sie einen Apacheweb -Server verwenden. 1. Installieren Sie zuerst die erforderliche Software, stellen Sie sicher, dass Ihr System auf dem neuesten Stand ist, und installieren Sie Apache und OpenSSL: sudoaptupdatesudoaptupgradesudoaptinsta

Gitlabs Plug-in-Entwicklungshandbuch zu Debian Gitlabs Plug-in-Entwicklungshandbuch zu Debian Apr 13, 2025 am 08:24 AM

Die Entwicklung eines Gitlab -Plugins für Debian erfordert einige spezifische Schritte und Kenntnisse. Hier ist ein grundlegender Leitfaden, mit dem Sie mit diesem Prozess beginnen können. Wenn Sie zuerst GitLab installieren, müssen Sie GitLab in Ihrem Debian -System installieren. Sie können sich auf das offizielle Installationshandbuch von GitLab beziehen. Holen Sie sich API Access Token, bevor Sie die API -Integration durchführen. Öffnen Sie das GitLab -Dashboard, finden Sie die Option "AccessTokens" in den Benutzereinstellungen und generieren Sie ein neues Zugriffs -Token. Wird generiert

Welcher Dienst ist Apache Welcher Dienst ist Apache Apr 13, 2025 pm 12:06 PM

Apache ist der Held hinter dem Internet. Es ist nicht nur ein Webserver, sondern auch eine leistungsstarke Plattform, die enormen Datenverkehr unterstützt und dynamische Inhalte bietet. Es bietet eine extrem hohe Flexibilität durch ein modulares Design und ermöglicht die Ausdehnung verschiedener Funktionen nach Bedarf. Modularität stellt jedoch auch Konfigurations- und Leistungsherausforderungen vor, die ein sorgfältiges Management erfordern. Apache eignet sich für Serverszenarien, die hoch anpassbare und entsprechende komplexe Anforderungen erfordern.

See all articles