การแสดงการล็อกแบบ Mutex
คลาสนี้ช่วยให้สคริปต์มั่นใจได้ว่าจะมีเพียงอินสแตนซ์เดียวของสคริปต์ที่เรียกใช้โค้ดส่วนหนึ่งๆ ในเวลาใดก็ตาม ซึ่งจะเป็นประโยชน์อย่างยิ่งสําหรับการเรียกกลับและทริกเกอร์ ซึ่งการกระทําของผู้ใช้อาจทําให้เกิดการเปลี่ยนแปลงในทรัพยากรที่แชร์ และคุณต้องการให้แน่ใจว่าไม่มีการชนกัน
ตัวอย่างต่อไปนี้แสดงวิธีใช้การล็อกในตัวแฮนเดิลการส่งแบบฟอร์ม
// 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); }
last Ticket Number อาจเปลี่ยนแปลงหลังจากอ่านจาก Script Properties แต่ก่อนที่จะเขียนค่าใหม่กลับเมธอด
| วิธีการ | ประเภทการแสดงผล | รายละเอียดแบบย่อ |
|---|---|---|
has | Boolean | แสดง true หากได้รับล็อก |
release | void | ปล่อยการล็อกเพื่อให้กระบวนการอื่นๆ ที่รอการล็อกดำเนินการต่อได้ |
try | Boolean | พยายามรับล็อก โดยจะหมดเวลาหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ |
wait | void | พยายามรับการล็อก โดยจะหมดเวลาพร้อมข้อยกเว้นหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ |
เอกสารโดยละเอียด
has Lock()
แสดง true หากได้รับล็อก เมธอดนี้จะแสดงผล false หากไม่เคยเรียกใช้ try หรือ wait หมดเวลาไปก่อนที่จะดึงข้อมูลล็อกได้
หรือหากมีการเรียกใช้ release
const lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
รีเทิร์น
Boolean — true หากได้รับล็อก หรือ false ในกรณีอื่นๆ
release Lock()
ปล่อยการล็อกเพื่อให้กระบวนการอื่นๆ ที่รอการล็อกดำเนินการต่อได้ ระบบจะปลดล็อกโดยอัตโนมัติเมื่อสคริปต์สิ้นสุด แต่เพื่อประสิทธิภาพสูงสุด คุณควรปลดล็อกทันทีที่ไม่ได้ต้องการสิทธิ์เข้าถึงส่วนของโค้ดแบบพิเศษอีกต่อไป วิธีนี้จะไม่มีผล หากยังไม่ได้ล็อก
โปรดทราบว่าหากคุณกำลังทำงานกับสเปรดชีต คุณควรเรียกใช้ SpreadsheetApp.flush() ก่อนที่จะปล่อยล็อก เพื่อส่งการเปลี่ยนแปลงที่รอดำเนินการทั้งหมดไปยังสเปรดชีตขณะที่คุณยัง มีสิทธิ์เข้าถึงพิเศษ
const lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
try Lock(timeoutInMillis)
พยายามขอล็อก โดยจะหมดเวลาหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ วิธีนี้จะไม่มีผลหากมีการล็อกอยู่แล้ว
const lock = LockService.getScriptLock(); const success = lock.tryLock(10000); if (!success) { Logger.log('Could not obtain lock after 10 seconds.'); }
พารามิเตอร์
| ชื่อ | ประเภท | คำอธิบาย |
|---|---|---|
timeout | Integer | ระยะเวลาในการรอเพื่อรับล็อกเป็นมิลลิวินาที |
รีเทิร์น
Boolean — true หากได้รับล็อก หรือ false ในกรณีอื่นๆ
wait Lock(timeoutInMillis)
พยายามรับการล็อก โดยจะหมดเวลาพร้อมข้อยกเว้นหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ เมธอดนี้เหมือนกับ try ยกเว้นว่าจะส่งข้อยกเว้น
เมื่อรับการล็อกไม่ได้แทนที่จะส่งคืน false
const lock = LockService.getScriptLock(); try { lock.waitLock(10000); } catch (e) { Logger.log('Could not obtain lock after 10 seconds.'); }
พารามิเตอร์
| ชื่อ | ประเภท | คำอธิบาย |
|---|---|---|
timeout | Integer | ระยะเวลาในการรอเพื่อรับล็อกเป็นมิลลิวินาที |
ส่ง
Error - หากเมธอดหมดเวลาไปก่อนที่จะได้รับล็อก