با استفاده از فیبرها در روبی یک زمانبندیکنندهٔ ساده بنویسید که سه فیبر را بهصورت نوبتی اجرا کند؛ هر فیبر باید پنج مقدار تولید کند (مثلاً اعداد یا حروف) و خروجی نوبتی نمایش داده شود.
2.0 بازدید آخرین ویرایش در 223 روز قبل ساعت 01:05 0.0
برای حل این مسئله از کلاس Fiber در روبی استفاده کنید: هر فیبر را با Fiber.new تعریف و درونش مقدارها را تولید کنید و بعد از تولید هر مقدار از Fiber.yield برای بازگرداندن کنترل به زمانبندیکننده استفاده کنید. زمانبندیکننده یک آرایه از فیبرها نگه میدارد و بهصورت حلقهای روی آنها resume فراخوانی میکند تا زمانی که همه فیبرها دیگر alive نباشند؛ فیبرهای تمامشده را از آرایه حذف کنید. نکات: از Fiber#alive? برای بررسی پایان فیبر استفاده کنید، از بلاککنندههای ورودی/خروجی سنگین پرهیز کنید و برای خطایابی ابتدا با فیبرهای ساده (مثلاً چاپ مقادیر) تست کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
ایدهٔ استفاده از سه فیبر برای اجرای نوبتی با هر فیبر پنج مقدار، با استفاده از Fiber.yield برای بازگرداندن کنترل به زمانبند، روش جالبی است. برای مدیریت پایان هر فیبر از Fiber#alive? استفاده کنید و فیبرهای پایانیافته را از آرایه نگهداشتنی حذف نمایید تا حلقهٔ زمانبند ادامه یابد. در هنگام دیباگ از چاپ مقادیر و خروجیهای ساده استفاده کنید و از عملیات IO بلاککننده پرهیز کنید تا رفتار نوبتدهی قابلاعتماد باشد. به خاطر داشته باشید فیبرهای روبی بهطور همزمانِ واقعی اجرا نمیشوند و اگر کار شما CPU-bound است، استفاده از threads یا مدلهای asynchronous ممکن است گزینهٔ بهتری باشد.
گزارش