Ilustracja blokady wzajemnego wykluczenia.
Ta klasa umożliwia skryptom zapewnienie, że dany fragment kodu jest wykonywany tylko przez jedną instancję skryptu naraz. Jest to szczególnie przydatne w przypadku wywołań zwrotnych i wyzwalaczy, gdy działanie użytkownika może spowodować zmiany w wspólnym zasobie, a chcesz mieć pewność, że nie dojdzie do kolizji.
Ten przykład pokazuje, jak użyć blokady w obiekcie obsługującym przesłanie 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); }Jeśli bez usługi blokowania 2 użytkownicy prześlą formularz mniej więcej w tym samym czasie, numery biletów mogą być takie same, ponieważ właściwość
last Ticket Number
może się zmienić po odczytaniu z Script Properties
, ale przed zapisaniem nowej wartości.Metody
Metoda | Zwracany typ | Krótki opis |
---|---|---|
has | Boolean | Zwraca wartość „prawda”, jeśli udało się uzyskać blokadę. |
release | void | Zwalnia blokadę, umożliwiając kontynuowanie innych procesów oczekujących na blokadę. |
try | Boolean | Próbuje uzyskać blokadę, która wygasa po określonym czasie w milisekundach. |
wait | void | Próbuje uzyskać blokadę, wygaszając po określonym czasie z wyjątkiem. |
Szczegółowa dokumentacja
has Lock()
Zwraca wartość „prawda”, jeśli udało się uzyskać blokadę. Ta metoda zwróci wartość false, jeśli metody try
lub wait
nie zostały nigdy wywołane, jeśli czas oczekiwania na zablokowanie wygasł, zanim udało się go pobrać, lub jeśli została wywołana metoda release
.
const lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
Powrót
Boolean
– wartość true (prawda), jeśli udało się uzyskać blokadę, w przeciwnym razie wartość false (fałsz).
release Lock()
Zwalnia blokadę, umożliwiając kontynuowanie innych procesów oczekujących na blokadę. Blokada jest automatycznie odblokowywana po zakończeniu skryptu, ale dla zwiększenia wydajności najlepiej odblokować ją, gdy nie potrzebujesz już wyłącznego dostępu do sekcji kodu. Ta metoda nie działa, jeśli blokada nie została uzyskana.
Jeśli pracujesz z arkuszem kalkulacyjnym, przed odblokowaniem go wywołaj metodę SpreadsheetApp.flush(), aby zatwierdzić wszystkie oczekujące zmiany w arkuszu, dopóki nadal masz do niego wyłączny dostęp.
const lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
try Lock(timeoutInMillis)
Próbuje uzyskać blokadę, która wygasa po określonym czasie w milisekundach. Ta metoda nie działa, 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 nałożenie blokady (w milisekundach). |
Powrót
Boolean
– wartość true (prawda), jeśli udało się uzyskać blokadę, w przeciwnym razie wartość false (fałsz).
wait Lock(timeoutInMillis)
Próbuje uzyskać blokadę, wygaszając po upływie podanej liczby milisekund. Ta metoda jest taka sama jak try
, z tym wyjątkiem, że zamiast zwracać wartość false, zwraca wyjątek, gdy nie udało się 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 nałożenie blokady (w milisekundach). |
Rzuty
Error
– jeśli metoda została przerwana przed uzyskaniem blokady;