Class Lock

قفل کردن

نمایشی از یک قفل محرومیت متقابل.

این کلاس به اسکریپت ها اجازه می دهد تا مطمئن شوند که تنها یک نمونه از اسکریپت یک بخش معین از کد را در یک زمان اجرا می کند. این به ویژه برای تماس‌ها و محرک‌ها مفید است، جایی که یک اقدام کاربر ممکن است باعث تغییراتی در یک منبع مشترک شود و می‌خواهید مطمئن شوید که برخوردی وجود ندارد.

مثال زیر نحوه استفاده از قفل را در کنترل کننده ارسال فرم نشان می دهد.

// 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);
}
بدون سرویس Lock، اگر دو کاربر تقریباً همزمان فرم را ارسال کنند، شماره بلیط ها ممکن است یکسان شوند، زیرا ویژگی lastTicketNumber می تواند پس از خواندن از ScriptProperties اما قبل از بازنویسی مقدار جدید تغییر کند. .

مواد و روش ها

روش نوع برگشت توضیح مختصر
hasLock() Boolean اگر قفل به دست آمده باشد، true برمی‌گرداند.
releaseLock() void قفل را آزاد می کند و به سایر فرآیندهای منتظر روی قفل اجازه می دهد تا ادامه پیدا کنند.
tryLock(timeoutInMillis) Boolean تلاش برای به دست آوردن قفل، زمانی که پس از تعداد میلی ثانیه ارائه شده به پایان می رسد.
waitLock(timeoutInMillis) void تلاش برای به دست آوردن قفل، با یک استثنا پس از تعداد میلی‌ثانیه‌های ارائه شده به پایان می‌رسد.

مستندات دقیق

hasLock()

اگر قفل به دست آمده باشد، true برمی‌گرداند. اگر tryLock(timeoutInMillis) یا waitLock(timeoutInMillis) هرگز فراخوانی نشده باشد، قبل از بازیابی قفل به پایان برسد، یا اگر releaseLock() فراخوانی شود، این متد false را برمی گرداند.

var lock = LockService.getScriptLock();
lock.tryLock(10000);
if (!lock.hasLock()) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

برگشت

Boolean - اگر قفل به دست آمده باشد درست است، در غیر این صورت نادرست است


releaseLock()

قفل را آزاد می کند و به سایر فرآیندهای منتظر روی قفل اجازه می دهد تا ادامه پیدا کنند. با پایان یافتن اسکریپت، قفل به طور خودکار آزاد می شود، اما برای کارایی بهتر است به محض اینکه دیگر نیازی به دسترسی انحصاری به بخشی از کد ندارید، آن را آزاد کنید. اگر قفل بدست نیامده باشد این روش هیچ تاثیری ندارد.

توجه داشته باشید که اگر با یک صفحه‌گسترده کار می‌کنید، باید قبل از آزاد کردن قفل، SpreadsheetApp.flush() را فراخوانی کنید تا در زمانی که هنوز به آن دسترسی انحصاری دارید، همه تغییرات معلق را در صفحه‌گسترده انجام دهید.

var lock = LockService.getScriptLock();
lock.waitLock(10000);
// Do some work on a shared resource.
lock.releaseLock();

tryLock(timeoutInMillis)

تلاش برای به دست آوردن قفل، زمانی که پس از تعداد میلی ثانیه ارائه شده به پایان می رسد. اگر قفل قبلاً بدست آمده باشد، این روش تأثیری ندارد.

var lock = LockService.getScriptLock();
var success = lock.tryLock(10000);
if (!success) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

مولفه های

نام تایپ کنید شرح
timeoutInMillis Integer چه مدت برای بدست آوردن قفل، در میلی ثانیه صبر کنید

برگشت

Boolean - اگر قفل به دست آمده باشد درست است، در غیر این صورت نادرست است


waitLock(timeoutInMillis)

تلاش برای به دست آوردن قفل، با یک استثنا پس از تعداد میلی‌ثانیه‌های ارائه شده به پایان می‌رسد. این روش مانند tryLock(timeoutInMillis) است با این تفاوت که در زمانی که قفل نمی تواند به دست آید به جای بازگشت false یک استثنا ایجاد می کند.

var lock = LockService.getScriptLock();
try {
  lock.waitLock(10000);
} catch (e) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

مولفه های

نام تایپ کنید شرح
timeoutInMillis Integer چه مدت برای بدست آوردن قفل، در میلی ثانیه صبر کنید

پرتاب می کند

Error - اگر زمان روش قبل از به دست آوردن قفل تمام شود