با استفاده از کتابخانه multiprocessing در پایتون برنامهای بنویسید که دو پروسه همزمان هر کدام ۱۰۰۰۰۰ بار یک شمارندهٔ مشترک را با استفاده از multiprocessing.Value و Lock افزایش داده و در انتها مقدار نهایی شمارنده را چاپ کند.
6.0 بازدید آخرین ویرایش در 202 روز قبل ساعت 02:30 0.0
برای حل این مسئله از multiprocessing.Value برای نگهداری شمارندهٔ مشترک بین پروسهها استفاده کنید (مثلاً typecode 'i' برای عدد صحیح)، و با multiprocessing.Lock از شرط مسابقه جلوگیری کنید؛ هر پروسه باید یک تابع هدف داشته باشد که درون یک حلقه مقدار value را با قفل افزایش میدهد. سپس دو Process بسازید، آنها را start و پس از پایان با join منتظر بمانید و مقدار نهایی را از فیلد .value چاپ کنید. این تمرین مفاهیمی از اشتراکگذاری دادهها در برنامههای Real-Time و HPC را به شما آشنا میکند و نشان میدهد که بدون قفل دادهها دچار race condition خواهند شد.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای جلوگیری از race condition بهتر است هر بار که مقدار shared value را افزایش میدهید، از Lock استفاده کنید و این افزایش را بهعنوان یک عملیات واحد با قفل انجام دهید. با این کار مقدار نهایی برابر با 200000 خواهد بود (اگر هر دو پروسه 100000 بار افزایش دهند). بهخاطر محدودیتهای مکانی در سیستمهای مختلف و نحوهی راهاندازی multiprocessing، مطمئن شوید که از if __name__ == '__main__' استفاده کنید تا در ویندوز با spawn مشکل ایجاد نشود. همچنین میتوانید به جای مدیریت پیچیده، از multiprocessing.Value با Lock به عنوان سازوکار همگامسازی استفاده کنید تا مشکلات race_condition حذف شوند.
گزارش