راه
۴ کیو· سختپیشرفتهPYTHON۴ ثانیه · ۲۵۶ مگابایت

تردکاری

فایل functions.py را داور فراهم می‌کند، پس from functions import f, g, h همان‌طور که در صورت سؤال آمده کار می‌کند. داور ثبت می‌کند هر تابع روی کدام ترد و به چه ترتیبی اجرا شد.

در سیستم‌های کامپیوتری مدرن، به‌ویژه در پردازش‌های سنگین مانند گرافیک یا محاسبات علمی، برای افزایش سرعت اجرا، وظایف (tasks) به صورت هم‌روند یا موازی اجرا می‌شوند. وابستگی بین این taskها اغلب به شکل یک گراف جهت‌دار نمایش داده می‌شود، جایی که یک task ممکن است برای شروع، به پایان رسیدن taskهای دیگر نیاز داشته باشد. در این تمرین، ما با یک نمونه ساده از این نوع وابستگی‌ها کار می‌کنیم و این taskها را به‌صورت هم‌روند و با رعایت ترتیب وابستگی‌ها اجرا می‌کنیم.

در این تمرین، مجموعه‌ای از توابع در سه گروه f، g و h داریم. این توابع وابستگی‌های خاصی دارند که می‌توان آن‌ها را به‌صورت لایه‌ای در نظر گرفت:

  • توابع لایه‌ی f باید قبل از توابع لایه‌ی g اجرا شوند.
  • توابع لایه‌ی g باید قبل از توابع لایه‌ی h اجرا شوند.
  • توابع درون هر لایه می‌توانند به‌صورت هم‌روند اجرا شوند.

f₁, f₂, f₃, f₄ ↓ g₁, g₂, g₃, g₄ ↓ h₁, h₂, h₃, h₄

هر یال جهت‌دار در این شکل نشان‌دهنده‌ی وابستگی است؛ تابعی که یال از آن خارج می‌شود باید قبل از تابعی که یال به آن وارد می‌شود، کامل شده باشد.


توابع مورد نظر در لیست‌های f، g و h در فایل functions.py قرار دارند. برای مثال:

  • f₁ با functions.f[0]
  • f₂ با functions.f[1]
  • و به همین ترتیب برای سایر توابع در لیست‌های g و h

⚠️ نکته: این توابع ورودی‌ای نمی‌گیرند و تنها با فراخوانی ساده (پرانتز خالی) اجرا می‌شوند.


شما باید تمام این توابع را با استفاده از تردها اجرا کنید، به گونه‌ای که شرایط زیر رعایت شود:

  1. توابع باید به‌ترتیب لایه اجرا شوند: ابتدا تمام توابع لایه f سپس تمام توابع لایه g در نهایت تمام توابع لایه h
  2. تمام توابع مربوط به یک لایه (مثلاً f₁، f₂، f₃ و f₄) باید به‌صورت هم‌روند آغاز به کار کنند و پیش از شروع لایه بعدی، تمام آن‌ها به پایان رسیده باشند.
  3. برای هر اندیس i (از 1 تا 4)، اجرای توابع fᵢ، gᵢ و hᵢ باید توسط یک ترد با name برابر با رشته‌ی str(i) انجام شود.

💡 راهنمایی ۱: نام‌گذاری

این به آن معنا نیست که یک ترد مشخص با نام '1' هر سه تابع f₁، g₁ و h₁ را به ترتیب اجرا کند. بلکه به این معناست که:

  • برای اجرای تابع f₁ از یک ترد با نام '1' استفاده شود.
  • سپس (پس از اتمام تمام توابع f) برای اجرای تابع g₁ از یک ترد با نام '1' دیگر استفاده شود.
  • نهایتاً برای اجرای تابع h₁ از یک ترد با نام '1' استفاده شود.

⚠️ مهم: مطابقت نام ترد با اندیس تابع در هنگام اجرا است.


شما باید کد خود را در تابعی به نام threadize() بنویسید. این تابع نیازی به گرفتن ورودی یا برگرداندن خروجی ندارد، صرفاً باید اجرای taskها را مدیریت کند.


💡 راهنمایی ۲: انتظار برای اتمام گروه

برای پیاده‌سازی انتظار برای اتمام گروهی از تردها قبل از شروع گروه بعدی، از متد join() برای هر ترد در آن گروه استفاده کنید. پس از فراخوانی start() برای تمام تردهای یک لایه، یک حلقه‌ی دیگر برای فراخوانی join() بر روی همان تردها، اجرای کد را تا پایان یافتن آن‌ها متوقف می‌کند.


💡 راهنمایی نهایی

ساختار کلی تابع threadize() به این شکل است:

python
from threading import Thread
from functions import f, g, h

def threadize():
    # تابع کمکی برای ایجاد و اجرای تردها
    def run_layer(layer_funcs):
        threads = []
        for i in range(len(layer_funcs)):
            t = Thread(target=layer_funcs[i], name=str(i + 1))
            t.start()
            threads.append(t)
        for t in threads:
            t.join()

    # اجرای لایه‌ها به ترتیب
    run_layer(f)
    run_layer(g)
    run_layer(h)
  • run_layer ← تابع کمکی برای اجرای یک لایه با تردهای موازی
  • برای هر تابع در لایه، یک ترد با نام برابر با str(i+1) ایجاد می‌شود.
  • همه‌ی تردها با start() شروع می‌شوند.
  • با join() منتظر اتمام همه‌ی تردهای آن لایه می‌مانیم.
  • لایه‌ها به ترتیب f → g → h اجرا می‌شوند.
  • در این تمرین، نیازی به دریافت ورودی از کاربر یا چاپ خروجی در کنسول ندارید.
  • شما فقط باید تابع threadize() را پیاده‌سازی کنید.
  • توابع در functions در پروژه پیاده‌سازی شده‌اند.
  • نام تردها باید دقیقاً برابر با '1'، '2'، '3' و '4' باشد.

✅ این تمرین را در ویرایشگر خود پیاده‌سازی کنید. به یاد داشته باشید که توابع هر لایه باید هم‌روند اجرا شوند و لایه‌ها به ترتیب اجرا گردند.

نمونه‌ها

ورودی نمونه ۱
خروجی نمونه ۱
every task ran exactly once: True
each task ran on the thread named after its index: True
each layer finished before the next began: True
the four tasks of each layer ran at the same time: True

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود