اگه دو ترد همزمان یک دادهٔ مشترک رو بخونن و تغییر بدن، ممکنه یکی تغییر دیگهای رو بپوشونه؛ به این وضعیت race condition میگیم. عملیات چندمرحلهای رو تنها به امید GIL یا چند اجرای موفق، امن فرض نکن. Lock در این مثال اجازه میده بخش حساس در هر لحظه فقط دست یک ترد باشه. with lock حتی در صورت خطا قفل رو آزاد میکنه.
این کد آموزشی محلی هست و در مرورگر اجرا نمیشه؛ در اینجا نتیجهٔ تضمینشده رو پیشبینی کن.
import threading
counter = 0
lock = threading.Lock()
def count():
global counter
for _ in range(1000):
with lock:
counter += 1
threads = [threading.Thread(target=count) for _ in range(2)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
print(counter)
فعالیت شما
نقش Lock و join رو در نتیجهٔ دادهٔ مشترک تشخیص بده.