javascript / expert
Snippet
Re-entrant Mutex für asynchrone Ressourcensperren
In Umgebungen mit hoher Parallelität wie Next.js Server Actions können Race Conditions auftreten, wenn mehrere Anfragen auf dieselbe gemeinsam genutzte Ressource zugreifen. Diese Mutex-Implementierung verwendet eine Promise-Kette, um sicherzustellen, dass immer nur ein Ausführungskontext den kritischen Bereich durchläuft, wodurch Datenkorruption verhindert wird, ohne den Haupt-Thread zu blockieren.
snippet.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class AsyncMutex {private queue = Promise.resolve();private locked = false;async runExclusive<T>(callback: () => Promise<T>): Promise<T> {const previous = this.queue;let resolveLock: () => void;this.queue = new Promise(res => { resolveLock = res; });await previous;try {return await callback();} finally {resolveLock!();}}}
nextjs
Erklärung
1
private queue = Promise.resolve();
Initialisiert ein bereits aufgelöstes Promise, um die Ausführungskette zu starten.
2
await previous;
Wartet, bis alle zuvor eingereihten Operationen abgeschlossen sind, bevor fortgefahren wird.
3
resolveLock!();
Gibt die Sperre frei und ermöglicht der nächsten Aufgabe in der Warteschlange den Beginn.