برای مدیریت تعداد زیادی از thread ها به کار میرود.
به تکه کد زیر توجه کنید:
import time
from concurrent.futures import ThreadPoolExecutor
def task(name):
print(f"Task {name} started")
time.sleep(1)
print(f"Task {name} finished")
with ThreadPoolExecutor(max_workers=2) as executor:
executor.map(task, [1, 2, 3, 4, 5])توضیح کد بالا:
- خط ۹: یک نمونه از کلاس ThreadPoolExecutor به نام executor ساختهایم به نحوی که فقط قادر باشد در هر لحظه فقط نهایتا دو thread را به صورت همزمان اجرا کند.
- خط ۱۰: تابع task را در thread هایی به صورت همزمان برای لیست مشخص شده اجرا میکنیم.
خروجی کد بالا شبیه زیر است.
Task 1 started
Task 2 started
Task 1 finished
Task 3 started
Task 2 finished
Task 4 started
Task 3 finished
Task 5 started
Task 4 finished
Task 5 finished
همانطور که مشاهده میکنید، دو تسک اول start شده و تا زمانی که یکی شان finish نشود، تسک دیگری start نمیشود.
اکنون تصور کنید که اگر نیاز داشتیم تا در تابع task از دستور return استفاده کنیم چطور میتوانستیم خروجی های آن را بگیریم. به کد زیر توجه کنید.
from concurrent.futures import ThreadPoolExecutor
import time
def task(name):
print(f"Task {name} started")
time.sleep(1)
print(f"Task {name} finished")
return f"Result of task {name}"
with ThreadPoolExecutor(max_workers=2) as executor:
# Submit tasks and get futures
futures = [executor.submit(task, i) for i in [1, 2, 3, 4]]
# Retrieve results from futures
results = [future.result() for future in futures]
print("Results:", results)