Heim > Backend-Entwicklung > Python-Tutorial > Neueste Open Source: effiziente universelle Python-Objektpooling-Bibliothek

Neueste Open Source: effiziente universelle Python-Objektpooling-Bibliothek

王林
Freigeben: 2023-04-17 09:04:02
nach vorne
1333 Leute haben es durchsucht

Neueste Open Source: effiziente universelle Python-Objektpooling-Bibliothek

In der Programmierung erfolgt die Erstellung von Objektmodulen hauptsächlich durch die Generierung von Objekten. Wenn das Objekt verwendet wird, wird es zu einem Modul, das nicht mehr benötigt wird und zerstört wird.

Wenn das System Objekte generiert und zerstört, erhöht sich der Speicherverbrauch erheblich. Gleichzeitig bleiben bei der Zerstörung von Objekten häufig Restinformationen zurück, was mit dem Problem von Speicherlecks einhergeht.

Im eigentlichen Programmentwicklungsprozess ist es häufig erforderlich, eine große Anzahl doppelter Objekte zu generieren und zu zerstören. Dadurch werden zu viele Informationen durch Speicherverluste erzeugt und können nicht vom System recycelt werden, wodurch mehr Speicher des Systems belegt wird Wenn zu viele Objekte generiert werden, ist es unmöglich zu bestimmen, welches Modul instanziiert und implementiert wird, was eine Belastung für das System darstellt und der Verwaltung und nachfolgenden Vorgängen nicht förderlich ist. Auf lange Sicht wird das Programm dadurch langsamer herunterfahren oder sogar abstürzen.

Der Objektpool ist ein Pool, der einen Stapel erstellter Objekte speichert. Es handelt sich um eine Struktur zur Verwaltung von Objekten. Wenn das Programm ein Objekt verwenden muss, kann es das Objekt direkt aus dem Pool abrufen, anstatt ein neues Objekt zu instanziieren.

Beim Programmieren konzentrieren sich die meisten Menschen nur auf die Verwendung von Objekten und die Realisierung von Effekten. Tatsächlich gibt es zwischen Erstellung und Verwendung einen Initialisierungsprozess, aber das System kombiniert die beiden Schritte Initialisierung und Zusammengenommen führt dies dazu, dass der Designer die Auswirkungen des Systems, Objekte zu erstellen und zu zerstören, ignoriert.

Im Allgemeinen sind die Kosten für die Erstellung und Zerstörung eines Objekts sehr gering und können vernachlässigt werden. Wenn ein Programm jedoch mehrere Erstellungen eines Objekts erfordert und die Erstellungszeit relativ lang ist, ist dies offensichtlich Teil begrenzt die Systemgeschwindigkeit.

Der Objektpool kann als die bevorzugte Methode zur Reduzierung des GC-Drucks angesehen werden und ist auch die einfachste Methode.

Der Objektpoolmodus eignet sich hauptsächlich für folgende Anwendungsszenarien:

  • Szenarien mit begrenzten Ressourcen. In einer Umgebung, die beispielsweise keine Skalierbarkeit erfordert (physische Ressourcen wie CPU und Speicher sind begrenzt), ist die CPU-Leistung nicht stark genug, der Speicher ist relativ knapp, die Speicherbereinigung und der Speicherjitter haben relativ große Auswirkungen. und die Effizienz der Speicherverwaltung muss verbessert werden. Die Reaktionsfähigkeit ist wichtiger als der Durchsatz.
  • Eine begrenzte Anzahl von Objekten im Speicher.
  • Objekte, deren Herstellung teuer ist.
  • Eine große Anzahl von Objekten mit kurzer Lebensdauer und geringen Initialisierungskosten werden gepoolt, um die Kosten für die Speicherzuweisung und -neuzuweisung zu reduzieren und eine Speicherfragmentierung zu vermeiden.
  • In einer dynamischen Sprache wie Python verlässt sich GC auf Referenztechnologie, um sicherzustellen, dass Objekte nicht vorzeitig recycelt werden. In einigen Szenarien kann es zu einer Leerlaufzeit kommen, die erstellt, aber nicht verwendet wird, was dazu führt, dass das Objekt recycelt wird. Es kann zur sicheren Aufbewahrung an den Objektpool delegiert werden.

Pond-Einführung

Pond ist ein effizienter allgemeiner Objektpool in Python mit den Merkmalen guter Leistung, geringem Speicherbedarf und hoher Trefferquote. Durch die Möglichkeit des automatischen Recycelns basierend auf der Häufigkeit basierend auf ungefähren Statistiken kann die Anzahl freier Objekte in jedem Objektpool automatisch angepasst werden.

Denn derzeit verfügt Python über keine bessere Objekt-Pooling-Bibliothek mit vollständigen Testfällen, vollständigen Codekommentaren und vollständiger Dokumentation. Gleichzeitig verfügt die aktuelle Mainstream-Objekt-Pooling-Bibliothek nicht über einen intelligenten automatischen Recyclingmechanismus.

Pond ist möglicherweise die erste Objekt-Pooling-Bibliothek in Python mit vollständigen, von der Community offengelegten Testfällen, einer Abdeckungsrate von mehr als 90 %, vollständigen Codekommentaren und vollständiger Dokumentation.

Pond ist von Apache Commons Pool, Netty Recycler, HikariCP und Caffeine inspiriert und integriert die Vorteile vieler davon.

Zweitens zählt Pond die Nutzungshäufigkeit jedes Objektpools in einem sehr kleinen Speicherplatz durch ungefähre Zählung und recycelt sie automatisch.

Wenn der Datenverkehr relativ zufällig und durchschnittlich ist, können die Standardstrategie und -gewichtung die Speichernutzung um 48,85 % reduzieren und die Trefferquote beim Ausleihen beträgt 100 %.

Neueste Open Source: effiziente universelle Python-Objektpooling-Bibliothek

Wenn der Datenverkehr eher dem 2/8-Gesetz entspricht, können die Standardstrategie und -gewichtung die Speichernutzung um 45,7 % reduzieren und die Ausleihtrefferquote beträgt 100 %.

Neueste Open Source: effiziente universelle Python-Objektpooling-Bibliothek

Designübersicht

Pond besteht hauptsächlich aus FactoryDict, Counter, PooledObjectTree und einem separaten Recycling-Thread.

FactoryDict

Die Verwendung von Pond erfordert die Implementierung der Objektfabrik PooledObjectFactory, die die Erstellung, Initialisierung, Zerstörung, Überprüfung und andere Vorgänge von Objekten ermöglicht und von Pond aufgerufen wird.

Damit der Objektpool das Speichern völlig unterschiedlicher Objekte unterstützt, verwendet Pond ein Wörterbuch, um den Namen jeder Factory-Klasse und das instanziierte Objekt der von ihr implementierten Factory-Klasse aufzuzeichnen.

Jede PooledObjectFactory sollte die vier Funktionen haben: Objekte erstellen, Objekte zerstören, überprüfen, ob die Objekte noch verfügbar sind, und die Objekte zurücksetzen.

Das Besondere ist, dass Pond das automatische Zurücksetzen von Objekten unterstützt, da es in einigen Szenarien Situationen geben kann, in denen dem Objekt zuerst ein Wert zugewiesen und übergeben werden muss und es dann recycelt werden muss, um eine Kontamination zu vermeiden Es wird empfohlen, diese Funktion in solchen Szenarien zu implementieren.

Counter

Counter speichert einen ungefähren Zähler.

PooledObjectTree

PooleedObjectTree ist ein Wörterbuch. Jeder Schlüssel entspricht einer First-In-First-Out-Warteschlange. Diese Warteschlangen sind threadsicher.

Jede Warteschlange enthält mehrere PooleedObjects. PooledObject speichert die Erstellungszeit, die letzte Leihzeit und das tatsächlich benötigte Objekt.

Thread-Sicherheit

Ponds Ausleihe und Recycling sind beide Thread-sicher. Das Warteschlangenmodul von Python bietet eine First-In-First-Out-Datenstruktur (FIFO), die für die Multithread-Programmierung geeignet ist. Es kann verwendet werden, um Nachrichten oder andere Daten sicher zwischen Producer- und Consumer-Threads zu übertragen.

Die Sperre wird vom Aufrufer verwaltet und alle mehreren Threads können sicher und einfach mit derselben Warteschlangeninstanz arbeiten. Das Ausleihen und Recyceln von Pond erfolgt beide in der Warteschlange, sodass es grundsätzlich als Thread-sicher angesehen werden kann.

Verleihmechanismus

Wenn Sie Pond zum Verleihen eines Objekts verwenden, prüft es zunächst, ob der Objekttyp, den Sie verleihen möchten, bereits in PooledObjectTree vorhanden ist. Wenn vorhanden, wird überprüft, ob der Objektpool dieses Objekts leer ist . Wenn ja, erstellt Empty ein neues.

Wenn sich im Objektpool überschüssige Objekte befinden, wird die Warteschlange verwendet, um ein Objekt anzuzeigen und zu überprüfen, ob dieses Objekt verfügbar ist. Wenn es nicht verfügbar ist, wird die entsprechende Factory automatisch aufgerufen, um das Objekt zu bereinigen und zu zerstören. Gleichzeitig wird seine GC-Anzahl in Python gelöscht, sodass es von GC schneller recycelt werden kann, und das nächste wird übernommen kontinuierlich, bis einer verfügbar ist.

Wenn dieses Objekt verfügbar ist, wird es direkt zurückgesendet. Unabhängig davon, ob ein Objekt aus dem Objektpool entfernt oder ein neues Objekt erstellt wird, wird der Zähler natürlich zum Erhöhen eines Zählers verwendet.

Recyclingmechanismus

Beim Recycling eines Objekts wird festgestellt, ob der Zielobjektpool vorhanden ist. Wenn er voll ist, wird das zurückzugebende Objekt automatisch zurückgegeben zerstört.

Anschließend wird geprüft, ob das Objekt zu lange ausgeliehen wurde. Sollte es die konfigurierte maximale Zeit überschreiten, wird es ebenfalls gelöscht.

Automatisches Recycling

Das automatische Recycling wird von Zeit zu Zeit ausgeführt, der Standardwert beträgt 300 s. Bereinigen Sie automatisch Objekte im Objektpool, die nicht häufig verwendet werden.

Anleitung

Sie können zuerst die Pond-Bibliothek installieren und in Ihrem Projekt darauf verweisen.

pip install pondpond
Nach dem Login kopieren
from pond import Pond, PooledObjectFactory, PooledObject
Nach dem Login kopieren

Zuerst müssen Sie eine Factory-Klasse für den Objekttyp deklarieren, den Sie einfügen möchten. Im folgenden Beispiel möchten wir beispielsweise, dass das gepoolte Objekt Hund ist, also deklarieren wir zuerst eine PooledDogFactory-Klasse und implementieren PooledObjectFactory.

class Dog:
 name: str
 validate_result:bool = True
class PooledDogFactory(PooledObjectFactory):
 def creatInstantce(self) -> PooledObject:
 dog = Dog()
 dog.name = "puppy"
 return PooledObject(dog)
 def destroy(self, pooled_object: PooledObject):
 del pooled_object
 def reset(self, pooled_object: PooledObject) -> PooledObject:
 pooled_object.keeped_object.name = "puppy"
 return pooled_object
 def validate(self, pooled_object: PooledObject) -> bool:
 return pooled_object.keeped_object.validate_result
Nach dem Login kopieren

Dann müssen Sie das Pond-Objekt erstellen:

pond = Pond(borrowed_timeout=2,
 time_between_eviction_runs=-1,
 thread_daemon=True,
 eviction_weight=0.8)
Nach dem Login kopieren

Pond kann einige Parameter übergeben, die Folgendes darstellen:

borrowed_timeout: Die Einheit ist Sekunden, der maximale Zeitraum des ausgeliehenen Objekts, das Objekt, das den Zeitraum überschreitet werden bei der Rückgabe automatisch zerstört. Wird nicht in den Objektpool aufgenommen.

time_between_eviction_runs: Die Einheit ist Sekunden, das Intervall zwischen dem automatischen Recycling.

thread_daemon: Daemon-Thread. Wenn True, wird der automatisch recycelte Thread geschlossen, wenn der Haupt-Thread geschlossen wird.

eviction_weight: Das Gewicht beim automatischen Recycling wird mit der maximalen Nutzungshäufigkeit multipliziert. Objekte im Objektpool, deren Nutzungshäufigkeit unter diesem Wert liegt, gelangen in den Bereinigungsschritt.

Instanziierte Factory-Klasse:

factory = PooledDogFactory(pooled_maxsize=10, least_one=False)
Nach dem Login kopieren

Alles, was PooledObjectFactory erbt, verfügt über einen eigenen Konstruktor, der die Parameter pooled_maxsize und least_one übergeben kann.

pooled_maxsize: Die maximale Anzahl von Objekten, die im von dieser Factory-Klasse generierten Objektpool platziert werden können.

least_one: Wenn True, behält der von dieser Factory-Klasse generierte Objektpool von Objekten beim Start der automatischen Bereinigung mindestens ein Objekt bei.

Registrieren Sie dieses Factory-Objekt bei Pond. Standardmäßig wird der Klassenname der Factory als Schlüssel von PooledObjectTree verwendet:

pond.register(factory)
Nach dem Login kopieren

Natürlich können Sie den Namen auch anpassen, und der Name wird als verwendet Schlüssel von PooledObjectTree:

pond.register(factory, name="PuppyFactory")
Nach dem Login kopieren

Nach erfolgreicher Registrierung beginnt Pond automatisch mit der Erstellung von Objekten gemäß der in der Fabrik festgelegten pooled_maxsize, bis der Objektpool gefüllt ist.

Objekte ausleihen und zurückgeben:

pooled_object: PooledObject = pond.borrow(factory)
dog: Dog = pooled_object.use()
pond.recycle(pooled_object, factory)
Nach dem Login kopieren

Natürlich können Sie Objekte nach Namen ausleihen und zurückgeben:

pooled_object: PooledObject = pond.borrow(name="PuppyFactory")
dog: Dog = pooled_object.use()
pond.recycle(pooled_object, name="PuppyFactory")
Nach dem Login kopieren

Einen Objektpool vollständig löschen:

pond.clear(factory)
Nach dem Login kopieren

Einen Objektpool nach Namen bereinigen:

pond.clear(name="PuppyFactory")
Nach dem Login kopieren

Normalerweise nur Sie Sie müssen die oben genannten Methoden verwenden, und die Objektgenerierung und das Objektrecycling erfolgen vollautomatisch.

Das obige ist der detaillierte Inhalt vonNeueste Open Source: effiziente universelle Python-Objektpooling-Bibliothek. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:51cto.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage