Heim > Artikel > Backend-Entwicklung > 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.
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 %.
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 %.
Pond besteht hauptsächlich aus FactoryDict, Counter, PooledObjectTree und einem separaten Recycling-Thread.
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 speichert einen ungefähren Zähler.
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.
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.
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.
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.
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.
Sie können zuerst die Pond-Bibliothek installieren und in Ihrem Projekt darauf verweisen.
pip install pondpond
from pond import Pond, PooledObjectFactory, PooledObject
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
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)
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)
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)
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 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)
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")
Einen Objektpool vollständig löschen:
pond.clear(factory)
Einen Objektpool nach Namen bereinigen:
pond.clear(name="PuppyFactory")
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!