Class Lock

قفل

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

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

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

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

روش ها

روش نوع برگشت شرح مختصر
has Lock() Boolean اگر قفل به دست آمده باشد، true برمی‌گرداند.
release Lock() void قفل را آزاد می کند و به سایر فرآیندهای منتظر روی قفل اجازه می دهد تا ادامه پیدا کنند.
try Lock(timeoutInMillis) Boolean تلاش برای به دست آوردن قفل، زمانی که پس از تعداد میلی ثانیه ارائه شده به پایان می رسد.
wait Lock(timeoutInMillis) void تلاش برای به دست آوردن قفل، با یک استثنا پس از تعداد میلی‌ثانیه‌های ارائه شده به پایان می‌رسد.

مستندات دقیق

has Lock()

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

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

بازگشت

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


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 In Millis Integer چه مدت برای بدست آوردن قفل، در میلی ثانیه صبر کنید

بازگشت

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


wait Lock(timeoutInMillis)

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

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

پارامترها

نام تایپ کنید توضیحات
timeout In Millis Integer چه مدت برای بدست آوردن قفل، در میلی ثانیه صبر کنید

پرتاب می کند

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