الگوهای همزمانی: الگوی بالکینگ – انجمن DEV

مقدمه
را الگوی طراحی Balking یک الگوی طراحی رفتاری است که برای مدیریت اقدامات وابسته به حالت در یک سیستم استفاده می شود. این تضمین می کند که عملیات تنها زمانی اجرا می شود که سیستم در وضعیت مناسب قرار دارد. اگر پیش شرط لازم برآورده نشود، عملیات سقط می شود یا سیستم “مخالف” می شود. برای کسانی مثل من که نمی دانند بالکینگ چیست، این چیزی است که گوگل در مورد آن می گوید: “تردید یا عدم تمایل به پذیرش یک ایده یا تعهد”. این الگو بهویژه در محیطها یا سیستمهای چند رشتهای که اقدامات نامعتبر میتواند باعث تداخل یا خطا شود، مفید است.
الگوی بالکینگ نیز از سوی برخی افراد جامعه بیشتر یک الگوی ضدالگو تلقی می شود تا یک الگوی طراحی. اگر یک شی نمی تواند API خود را پشتیبانی کند، باید API را محدود کند تا تماس متخلف در دسترس نباشد یا به طوری که تماس بدون محدودیت انجام شود. این یک الگوی قدیمی است که به نظر می رسد زمانی به وجود آمده است که JVM ها کندتر بودند و همگام سازی به خوبی امروز درک و اجرا نمی شد. صرف نظر از اینکه ارزش بحث را دارد و استفاده از آن یا نه بستگی به توسعه دهندگان دارد.
الگوی Balking بر سه مفهوم اساسی تکیه دارد
- وضعیت نگهبانی: شرطی که برای ادامه عملیات باید رعایت شود.
- اقدامات وابسته به دولت: عملیاتی که به وضعیت فعلی سیستم بستگی دارد.
- ایمنی نخ: این الگو اغلب از قفل ها یا مکانیسم های هماهنگ سازی دیگر برای اطمینان از ایمنی در محیط های همزمان استفاده می کند.
بیایید با یک مثال این موارد را درک کنیم:
یک سیستم چاپ الگوی Balking را نشان می دهد:
- سناریو: یک چاپگر می تواند تنها یک درخواست چاپ را در یک زمان پردازش کند. حتی اگر چندین فرآیند می توانند درخواست چاپ را ارسال کنند.
- وضعیت نگهبانی: برای رسیدگی به درخواست چاپ جدید، چاپ نباید به طور فعال “چاپ” باشد.
- رفتار: اگر چاپگر مشغول باشد، سیستم متوقف می شود و درخواست های چاپ جدید را ادامه نمی دهد.
توجه: بله، ما میتوانیم با استفاده از یک صف این کار را انجام دهیم، اما بیایید فرض کنیم فعلاً نمیدانیم که چنین ساختار دادهای زیبا وجود دارد.
import threading
import time
class Printer:
def __init__(self):
self.state = "idle"
self.lock = threading.Lock()
def start_printing(self, job_id):
print(f"Attempting to start Print Job {job_id}...")
with self.lock: # Ensure thread safety
if self.state == "printing":
print(f"Balking: Print Job {job_id} cannot start. Printer is busy.")
return
self.state = "printing"
# Simulate the printing process
print(f"Print Job {job_id} started.")
time.sleep(3)
print(f"Print Job {job_id} completed.")
with self.lock:
self.printing = "idle"
# Multiple threads attempting to start print jobs
printer = Printer()
threads = [
threading.Thread(target=printer.start_printing, args=(1,)),
threading.Thread(target=printer.start_printing, args=(2,))
]
for t in threads:
t.start()
for t in threads:
t.join()
با نگاه کردن به کد می توانیم ببینیم که اگر درخواست چاپ ارسال کنیم start_printing
به printer
و printer
مشغول است وضعیت فعلی آن را بررسی می کند self.state
و اگر حالت “چاپ” باشد، بدون انجام کاری برمی گردد. در غیر این صورت، آن درخواست را می گیرد و وضعیت آن را بر اساس آن تنظیم می کند.
چه زمانی از الگوی Balking استفاده کنیم
- سیستم های چند رشته ای: برای جلوگیری از شرایط مسابقه یا عملیات نامعتبر.
- گردش کار وابسته به دولت: وقتی اعمال فقط در حالات معینی جایز است.
- مدیریت منابع: برای محافظت در برابر استفاده نادرست از منابع مشترک. اشیایی که از این الگو استفاده می کنند عموماً فقط در حالتی هستند که به طور موقت اما برای مدت زمان نامعلومی مستعد توقف هستند. اگر قرار است اجسام در حالتی باقی بمانند که مستعد توقف برای مدت زمان مشخص و محدودی هستند، آنگاه الگوی تعلیق محافظت شده ممکن است ترجیح داده شود.
مزایای الگوی بالکینگ
- از عملیات نامعتبر جلوگیری می کند: نگهبانان اطمینان حاصل می کنند که عملیات فقط در شرایط معتبر انجام می شود.
- ایمنی نخ: به ویژه در سیستم های چند رشته ای مفید است.
- منطق را ساده می کند: اقدامات وابسته به حالت را در یک الگوی واضح و قابل استفاده مجدد در بر می گیرد.
معایب
- کاربرد محدود: زمانی که عملکردها باینری هستند (مجاز یا غیرمجاز) مفید هستند.
- سربار بالقوه: بررسی های نگهبانی و مکانیسم های هماهنگ سازی می توانند هزینه های عملکرد را معرفی کنند.
نتیجه گیری
الگوی طراحی Balking یک راه موثر برای مدیریت اقدامات وابسته به دولت و جلوگیری از عملیات نامعتبر در سیستم های نرم افزاری ارائه می دهد. با معرفی شرایط محافظ روشن و اطمینان از ایمنی نخ، قابلیت اطمینان و قابلیت نگهداری سیستم را افزایش می دهد. الگوی Balking رویکردی ساختاریافته برای جلوگیری از تضادها و حفظ یکپارچگی عملیاتی، خواه جلوگیری از سفرهای متعدد در سیستم رزرو تاکسی باشد یا مدیریت کارهای چاپی همزمان. در نهایت، انتخاب استفاده از Balking Pattern به نیازهای خاص برنامه شما و نیازهای همزمان آن بستگی دارد.
مراجع