Reprezentacja blokady wzajemnego wykluczania.
Ta klasa umożliwia skryptom upewnienie się, że w danym momencie tylko jedna instancja skryptu wykonuje daną sekcję kodu. Jest to szczególnie przydatne w przypadku wywołań zwrotnych i wyzwalaczy, gdy działanie użytkownika może spowodować zmiany w zasobie udostępnionym i chcesz mieć pewność, że nie dojdzie do kolizji.
Przykład poniżej pokazuje, jak użyć blokady w procedurze obsługi przesyłania formularza.
// Generates a unique ticket number for every form submission. function onFormSubmit(e) { const targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1); // Gets a script lock before modifying a shared resource. const lock = LockService.getScriptLock(); // Waits for up to 30 seconds for other processes to finish. lock.waitLock(30000); const scriptProperties = PropertiesService.getScriptProperties(); const ticketNumber = Number(scriptProperties.getProperty('lastTicketNumber')) + 1; scriptProperties.setProperty('lastTicketNumber', ticketNumber); // Releases the lock so that other processes can continue. lock.releaseLock(); targetCell.setValue(ticketNumber); }
lastTicketNumber może się zmienić po odczytaniu z ScriptProperties, ale przed zapisaniem nowej wartości.Metody
| Metoda | Zwracany typ | Krótki opis |
|---|---|---|
has | Boolean | Zwraca wartość true, jeśli blokada została uzyskana. |
release | void | Zwalnia blokadę, umożliwiając kontynuowanie innym procesom oczekującym na blokadę. |
try | Boolean | Próbuje uzyskać blokadę, a po upływie podanej liczby milisekund przekracza limit czasu. |
wait | void | Próbuje uzyskać blokadę, a po upływie podanej liczby milisekund przekracza limit czasu i zgłasza wyjątek. |
Szczegółowa dokumentacja
hasLock()
Zwraca wartość true, jeśli blokada została uzyskana. Ta metoda zwraca wartość false, jeśli metody tryLock(timeoutInMillis) lub waitLock(timeoutInMillis) nie zostały nigdy wywołane, upłynął limit czasu przed pobraniem blokady lub wywołano metodę releaseLock().
const lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
Powrót
Boolean – true, jeśli blokada została uzyskana, a w przeciwnym razie – false.
releaseLock()
Zwalnia blokadę, umożliwiając kontynuowanie innym procesom oczekującym na blokadę. Blokada jest zwalniana automatycznie po zakończeniu skryptu, ale dla większej wydajności najlepiej jest ją zwalniać, gdy nie potrzebujesz już wyłącznego dostępu do fragmentu kodu. Ta metoda nie wywołuje żadnego efektu, jeśli blokada nie została uzyskana.
Pamiętaj, że jeśli pracujesz z arkuszem kalkulacyjnym, przed zwolnieniem blokady musisz wywołać funkcję SpreadsheetApp.flush(), aby zatwierdzić wszystkie oczekujące zmiany w arkuszu, gdy masz do niego wyłączny dostęp.
const lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
tryLock(timeoutInMillis)
Próbuje uzyskać blokadę, a po upływie podanej liczby milisekund przekracza limit czasu. Ta metoda nie ma wpływu, jeśli blokada została już uzyskana.
const lock = LockService.getScriptLock(); const success = lock.tryLock(10000); if (!success) { Logger.log('Could not obtain lock after 10 seconds.'); }
Parametry
| Nazwa | Typ | Opis |
|---|---|---|
timeout | Integer | Czas oczekiwania na uzyskanie blokady w milisekundach. |
Powrót
Boolean – true, jeśli blokada została uzyskana, a w przeciwnym razie – false.
waitLock(timeoutInMillis)
Próbuje uzyskać blokadę, a po upływie podanej liczby milisekund przekracza limit czasu i zgłasza wyjątek. Ta metoda jest taka sama jak tryLock(timeoutInMillis), z tą różnicą, że zamiast zwracać wartość false, zgłasza wyjątek, gdy nie można uzyskać blokady.
const lock = LockService.getScriptLock(); try { lock.waitLock(10000); } catch (e) { Logger.log('Could not obtain lock after 10 seconds.'); }
Parametry
| Nazwa | Typ | Opis |
|---|---|---|
timeout | Integer | Czas oczekiwania na uzyskanie blokady w milisekundach. |
Rzuty
Error – jeśli metoda przekroczyła limit czasu, zanim udało się uzyskać blokadę.