مفهوم Event
فرض کنید چند دونده روی خط شروع ایستادهاند. آنها آماده دویدن هستند، اما حق ندارند حرکت کنند تا زمانی که داور تپانچه را شلیک کند.
در پایتون، threading.Event دقیقاً نقش تپانچه داور را بازی میکند. این کلاس یک راه بسیار ساده برای ارتباط بین تردهاست تا یک ترد بتواند به تردهای دیگر بگوید: «صبر کنید… صبر کنید… حالا حرکت کنید!»
Event یک مکانیزم هماهنگی است که به چندین نخ اجازه میدهد تا به صورت همزمان روی یک رویداد منتظر بمانند و بعداً با فعال کردن آن، همه آنها به صورت همزمان ادامه دهند. برای این کار ابتدا یک شیء از کلاس Event ایجاد میکنیم، سپس میتوانیم با استفاده از متدهای wait و set و clear آن را مدیریت کنیم.
مکانیزم درونی Event
کلاس Event در دل خود فقط یک متغیر ساده از نوع Boolean دارد.
- اگر این متغیر
Falseباشد، تردهایی که به اینEventنگاه میکنند متوقف میشوند و منتظر میمانند. - اگر این متغیر
Trueشود، تمام تردهای منتظر، همزمان آزاد میشوند و کارشان را شروع میکنند.
در تکه کد زیر، یک مسابقه دو را شبیه سازی کرده ام.
import threading
import time
def worker(runner_id, start_signal):
print(f"Runner {runner_id} is ready")
start_signal.wait()
print(f"Runner {runner_id} is running")
# 1. Create the Event (Initial state is False / Red Light)
start_signal = threading.Event()
# 2. Create and start 3 worker threads
for i in range(1, 4):
t = threading.Thread(target=worker, args=(i, start_signal))
t.start()
print("Please Waite!")
time.sleep(3)
print("GO!")
# 3. Give the green light! This unblocks all 3 workers at the exact same time.
start_signal.set()در تکه کد بالا:
- خط ۴ تا ۷: تابع
workerیک دونده را شبیه سازی میکند که ابتدا برای مسابقه آماده میشود و سپس منتظر میماند تا مسابقه با دستور داور شروع شود. - خط ۱۰: سیگنالی که در حکم تپانچه داور است ایجاد شده است.
- خط ۱۵: ترد ها به محض ایجاد شدن
startمیشوند. - خط ۱۸: یک وقفه سه ثانیه ای ایجاد شده است.
- خط ۲۲: با فراخوانی متد
setمقدارTrueدرEventقرار میگیرد و با این کار یک سیگنال ارسال میشود. - خط۶: متد
waitکه قبلا منتظر دریافت این سیگنال است، سیگنال را دریافت کرده و اجازه میدهد تا باقی کد هایworkerاجرا شوند.