Verbesserung des gleichzeitigen Objektzugriffs durch asynchrone schlüsselbasierte Sperrung
Dieser Artikel befasst sich mit der gleichzeitigen Objektsperre mithilfe gehashter URL-Schlüssel innerhalb der ImageProcessor-Bibliothek. Während der Cache-Aktualisierung treten in der Bibliothek zeitweise Dateizugriffsfehler auf. Eine benutzerdefinierte AsyncDuplicateLock
-Klasse, die für das asynchrone schlüsselbasierte Sperren entwickelt wurde, erwies sich als unzureichend.
Analyse der AsyncDuplicateLock
Klasse
Die Klasse AsyncDuplicateLock
bietet synchrone (Lock
) und asynchrone (LockAsync
) Sperrmethoden. Beide verwenden einen Schlüssel, um das verschlossene Objekt zu identifizieren.
Verriegelungsmechanismus
Der Schließvorgang umfasst die folgenden schlüsselbasierten Schritte:
Wait
(synchron) oder WaitAsync
(asynchron) aufgerufen, um die Sperre zu erhalten.Release
(synchron) oder asynchron freigegeben.Identifizierung des Problems
Der Fehler des ursprünglichen Codes besteht darin, dass SemaphoreSlim
-Instanzen vorzeitig aus dem ConcurrentDictionary
entfernt werden. Diese vorzeitige Entsorgung vor der Semaphorfreigabe führt dazu, dass mehrere Semaphore mit demselben Schlüssel verknüpft sind, was zu Fehlern beim Hinzufügen von Caches führt.
Verbesserte Implementierung
Unsere Lösung führt einen Referenzzähler für jedes Semaphor im Wörterbuch ein. Eine einzige Sperre gewährleistet die atomare Dekrementierung und Entfernung von Referenzzählern. Dieser verbesserte Ansatz bietet eine robuste Sperrung und verhindert den vorherigen Fehler.
Diese verbesserte Implementierung ermöglicht zuverlässiges asynchrones schlüsselbasiertes Sperren, minimiert Cache-Fehler und stellt sicher, dass die ImageProcessor-Bibliothek ordnungsgemäß funktioniert.
Das obige ist der detaillierte Inhalt vonWie kann asynchrones schlüsselbasiertes Sperren den gleichzeitigen Objektzugriff verbessern und Cache-Fehler verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!