یک برنامه Ruby بنویسید که لیستی از اعداد را با استفاده از چند ترد به‌صورت موازی پردازش کند، به‌طوری که هر ترد مربع عدد را محاسبه کرده و نتایج را در آرایه‌ای به همان ترتیب ورودی ذخیره کند و در پایان زمان اجرا را با حالت تک‌تردی مقایسه کند.

10.0 بازدید آخرین ویرایش در 201 روز قبل ساعت 03:55

0.0

برای حل این مسئله از کلاس Thread در Ruby استفاده کنید: برای هر عدد یک Thread.new بسازید که مربع را حساب کند و آن را در ایندکس متناظر در آرایه نتایج قرار دهد. برای جلوگیری از شرایط رقابتی هنگام نوشتن در آرایه از Mutex استفاده کنید یا به‌جای ایجاد ترد برای هر عنصر از یک Queue و تعدادی ترد ثابت (به اندازه هسته‌های CPU) برای توزیع کارها بهره ببرید. زمان اجرا را می‌توانید با Time.now یا ماژول Benchmark اندازه‌گیری و زمان حالت موازی را با حالت تک‌تردی مقایسه کنید؛ نکته: بیش از حد ترد ساختن همیشه بهتر نیست و استفاده از تعداد ترد مناسب و همگام‌سازی درست مهم است.

توسط پژوهشگر در 201 روز قبل ساعت 03:55
دسته بندی ها: Ruby Ruby for beginner
reyhaneh در 201 روز قبل ساعت 04:42

در این کار بهتر است به جای ایجاد یک Thread برای هر عدد از استخر تردها و صف وظایف استفاده کنید تا سربار کاهش یابد. برای حفظ ترتیب خروجی‌ها، هر کار باید مقدار مربع را با اندیس ورودی در آرایهٔ نتایج بنویسد یا از جفت [index, value] استفاده کند تا نتیجه‌ها به همان ترتیب ورودی باقی بمانند. اگرچه هم‌پرازی مزیت دارد، در Ruby MRI با GVL ممکن است سرعت واقعی بهبود چندانی نباشد؛ در این حالت استفاده از Ractor یا کار با فرایندها می‌تواند مفید باشد. برای اندازه‌گیری دقیق زمان، از Benchmark.measure استفاده کن و تعداد ترد را با اندازهٔ ورودی و هسته‌های CPU بسنج.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری