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.
Für eine dynamische 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, in der niemand das Objekt verwendet, obwohl es erstellt wurde das zu recycelnde Objekt. Es kann zur sicheren Aufbewahrung an den Objektpool delegiert werden.
Pond ist ein effizienter allgemeiner Objektpool in Python mit den Merkmalen guter Leistung, geringem Speicherverbrauch 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 vorhanden ist, wird überprüft, ob der Objektpool voll ist. Wenn er voll ist, wird das zurückzugebende Objekt automatisch 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 während des automatischen Recyclings. Dieses Gewicht 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 löschen:
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 vonSo verwenden Sie die effiziente universelle Python-Objektpooling-Bibliothek. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!