با استفاده از ماژول multiprocessing و کلاس Queue یک برنامه پایتون بنویسید که یک فرآیند تولیدکننده اعداد 1 تا 100 را در یک صف قرار دهد و چندین فرآیند مصرفکننده این اعداد را از صف برداشته، مربع هر عدد را محاسبه کرده و در یک صف خروجی قرار دهند و در پایان نتایج جمعآوری و چاپ شوند.
22.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 04:12در حل این مسئله از multiprocessing.Queue برای ارسال کارها و نتایج بین فرآیندها استفاده کنید: یک فرآیند تولیدکننده (producer) اعداد 1 تا 100 را در input_queue قرار میدهد، سپس برای خاتمه دادن به مصرفکنندهها به ازای هر مصرفکننده یک sentinel مثل None در صف میگذارد. چند فرآیند مصرفکننده (consumer) در حلقهای q.get() میکنند تا وقتی sentinel را دیدند متوقف شوند، برای هر عدد مربع را محاسبه و با output_queue.put() نتیجه را ارسال کنند. در تابع اصلی از if __name__ == "__main__": استفاده کنید، تعداد مصرفکنندهها را میتوانید با multiprocessing.cpu_count() تنظیم نمایید، از timeout یا بررسی sentinel برای جلوگیری از بنبست استفاده کنید و مطمئن شوید که فرآیندها را start() و join() میکنید و صفها را قبل از خروج ببندید؛ توجه داشته باشید که تنها اشیاء قابل pickle را در Queue قرار دهید و برای مسائل بزرگتر/HPC میتوان به Pool یا تقسیم بار پیشرفتهتر فکر کرد.
نکته: هنگام استفاده از multiprocessing.Queue و sentinel مثل None برای خاتمه مصرفکنندهها مطمئن شوید که برای هر مصرفکننده یک sentinel ارسال میکنید تا بنبست رخ ندهد، همچنین تنها اشیاء قابل pickle را در صف قرار دهید و پس از پایان کار output_queue.close() و output_queue.join_thread() را فراخوانی کنید تا منابع آزاد شوند. برای جلوگیری از بنبست یا بلوکه شدن طولانی در مواقع خطا از q.get(timeout=...) یا مدیریت KeyboardInterrupt استفاده کنید و همه فرآیندها را با start() و سپس join() جمع کنید. در بارهای کاری بزرگتر یا در صورت نیاز به کارایی بالاتر به استفاده از multiprocessing.Pool یا روشهای تقسیم بار پیشرفتهتر فکر کنید تا overhead مربوط به چندین Queue کاهش یابد.
گزارش