پیشنیاز
قبل از مطالعه این بخش، باید با مفهوم قفل کردن منابع مشترک و چرایی آن آشنا باشید.
قفلگذاری در concurrent.futures.ThreadPoolExecutor
برای قفل کردن ترد هایی که با این ماژول ساخته شده اند، از threading.Lock یا threading.RLock استفاده میکنیم.
from concurrent.futures import ThreadPoolExecutor
from threading import Lock
# تعریف قفل
lock = Lock()
def add():
global number
for _ in range(100000):
# قفل کردن قبل از دسترسی به متغیر مشترک با استفاده از with
with lock:
number += 1
def subtract():
global number
for _ in range(100000):
# قفل کردن قبل از دسترسی به متغیر مشترک با استفاده از with
with lock:
number -= 1
number = 0
# ایجاد و شروع وظایف با استفاده از ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=2) as executor:
future1 = executor.submit(add)
future2 = executor.submit(subtract)
# منتظر ماندن برای اتمام وظایف
future1.result()
future2.result()
# چاپ مقدار نهایی number
print(number)