Hình minh hoạ một khoá loại trừ lẫn nhau.
Lớp này cho phép tập lệnh đảm bảo rằng chỉ một phiên bản của tập lệnh thực thi một phiên bản nhất định của từng phần mã cùng một lúc. Điều này đặc biệt hữu ích đối với các lệnh gọi lại và trình kích hoạt, trong đó người dùng có thể gây ra thay đổi đối với tài nguyên dùng chung và bạn muốn đảm bảo rằng không có va chạm.
Ví dụ sau đây cho biết cách sử dụng khoá trong trình xử lý gửi biểu mẫu.
// Generates a unique ticket number for every form submission. function onFormSubmit(e) { var targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1); // Gets a script lock before modifying a shared resource. var lock = LockService.getScriptLock(); // Waits for up to 30 seconds for other processes to finish. lock.waitLock(30000); var 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
có thể thay đổi sau đó
được đọc từ ScriptProperties
nhưng trước khi giá trị mới được ghi lại.Phương thức
Phương thức | Loại dữ liệu trả về | Mô tả ngắn |
---|---|---|
hasLock() | Boolean | Trả về true nếu khoá được có được. |
releaseLock() | void | Mở khoá để các quy trình khác đang chờ khoá tiếp tục hoạt động. |
tryLock(timeoutInMillis) | Boolean | Cố gắng có được khoá, hết thời gian chờ sau số mili giây đã cho. |
waitLock(timeoutInMillis) | void | Cố gắng mở khoá, hết thời gian chờ ngoại trừ sau số lần được cung cấp mili giây. |
Tài liệu chi tiết
hasLock()
Trả về true nếu khoá được có được. Phương thức này sẽ trả về giá trị false nếu tryLock(timeoutInMillis)
hoặc
waitLock(timeoutInMillis)
chưa từng được gọi, hết thời gian chờ trước khi truy xuất khoá hoặc nếu releaseLock()
được gọi.
var lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
Cầu thủ trả bóng
Boolean
– true nếu khoá được có, nếu không thì sẽ có giá trị false
releaseLock()
Mở khoá để các quy trình khác đang chờ khoá tiếp tục hoạt động. Khoá đang tự động phát hành khi tập lệnh chấm dứt, nhưng để hiệu quả, tốt nhất là phát hành tập lệnh đó ngay khi bạn không còn cần quyền truy cập độc quyền vào một phần mã nữa. Phương thức này không có tác dụng nếu bạn chưa có khoá.
Lưu ý rằng nếu đang làm việc với một bảng tính, bạn nên gọi Bảng tínhApp.flush() trước khi mở khoá, để áp dụng tất cả các thay đổi đang chờ xử lý đối với bảng tính trong khi bạn vẫn có quyền truy cập độc quyền vào ứng dụng đó.
var lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
tryLock(timeoutInMillis)
Cố gắng có được khoá, hết thời gian chờ sau số mili giây đã cho. Phương thức này sẽ không có hiệu lực nếu khoá đã được sử dụng.
var lock = LockService.getScriptLock(); var success = lock.tryLock(10000); if (!success) { Logger.log('Could not obtain lock after 10 seconds.'); }
Tham số
Tên | Loại | Mô tả |
---|---|---|
timeoutInMillis | Integer | thời gian chờ để có được khoá, tính bằng mili giây |
Cầu thủ trả bóng
Boolean
– true nếu khoá được có, nếu không thì sẽ có giá trị false
waitLock(timeoutInMillis)
Cố gắng mở khoá, hết thời gian chờ ngoại trừ sau số lần được cung cấp
mili giây. Phương thức này giống với tryLock(timeoutInMillis)
, ngoại trừ việc sẽ gửi một trường hợp ngoại lệ
khi không thể có được khoá thay vì trả về giá trị false.
var lock = LockService.getScriptLock(); try { lock.waitLock(10000); } catch (e) { Logger.log('Could not obtain lock after 10 seconds.'); }
Tham số
Tên | Loại | Mô tả |
---|---|---|
timeoutInMillis | Integer | thời gian chờ để có được khoá, tính bằng mili giây |
Gửi
Error
– nếu phương thức đã hết thời gian chờ trước khi có được khoá