اکنون بخش دشوار اینجاست:
بر اساس موارد بالا، ممکن است استدلال کنید که اگر از پروفایل برای شناسایی عملکرد استفاده کنیم، میتوانیم دوباره نمایه نماییم تا مقایسه کنیم. این از نظر فنی امکان پذیر است، اما بستگی به این دارد که شما در حال تلاش برای رسیدن به این معیار هستید. از آنجایی که ابزارهای نمایه سازی عملکرد تک تک عملکردها را در حین اجرای برنامه ردیابی می کنند، مقداری سربار اضافه می کنند که زمان اجرا را کاهش می دهد، که می تواند تأثیر مربوط به تغییر را تغییر دهد.
یک راه بهتر برای ارزیابی تأثیر کلی عملکرد یک تغییر، گرفتن معیارها با استفاده از ابزارهایی است که استانداردهای عمومی صنعت مانند TTFB را اندازه گیری می کند.
از طرف دیگر، ابزارهای محکزدن عملکرد تک تک عملکردها را ردیابی نمی کنند، بلکه فقط قطعات خاصی را که باید به طور صریح پیکربندی شوند، بررسی می کنند.
بنابراین آنها برای شناسایی تنگناهای عملکرد بتن برای بهبود در نرم افزار یا زیر سیستم شما مناسب نیستند.
به طور کلی در نظر داشته باشید که از ابزار مناسب برای کار استفاده کنید. صرف نظر از نمایه سازی یا محک زدن، باید توجه داشت که ابزارها اعداد مختلفی را بین اجراهای مختلف تولید می کنند که به عوامل مختلفی مانند ظرفیت دستگاه شما، حافظه در دسترس و ... بستگی دارد.
یکی از بهترین روش ها برای توضیح این تنوع مورد انتظار، انجام چندگانه است.
بررسی می کند تا تأیید کند که یک رعایت خاص به دلیل ویژگی های محیطی فقط "تصادفی" نبوده است
لینک وبسایت
#monitoring
@code_crafters
بر اساس موارد بالا، ممکن است استدلال کنید که اگر از پروفایل برای شناسایی عملکرد استفاده کنیم، میتوانیم دوباره نمایه نماییم تا مقایسه کنیم. این از نظر فنی امکان پذیر است، اما بستگی به این دارد که شما در حال تلاش برای رسیدن به این معیار هستید. از آنجایی که ابزارهای نمایه سازی عملکرد تک تک عملکردها را در حین اجرای برنامه ردیابی می کنند، مقداری سربار اضافه می کنند که زمان اجرا را کاهش می دهد، که می تواند تأثیر مربوط به تغییر را تغییر دهد.
یک راه بهتر برای ارزیابی تأثیر کلی عملکرد یک تغییر، گرفتن معیارها با استفاده از ابزارهایی است که استانداردهای عمومی صنعت مانند TTFB را اندازه گیری می کند.
خلاصه بگم TTFB مخفف Time to First Byte است. اگر بخواهیم به دور از هرگونه پیچیدگی معنای آن را بگوییم، یعنی مدتزمانی که طول میکشد تا اولین بایت از پاسخ سرور به سیستم کاربر درخواستکننده برسد. بگذارید قضیه را کمی باز کنیم. یکی از مهمترین کاراییهای TTFB این است که کند بودن بیشازحد سرور را معلوم میکند.
از طرف دیگر، ابزارهای محکزدن عملکرد تک تک عملکردها را ردیابی نمی کنند، بلکه فقط قطعات خاصی را که باید به طور صریح پیکربندی شوند، بررسی می کنند.
بنابراین آنها برای شناسایی تنگناهای عملکرد بتن برای بهبود در نرم افزار یا زیر سیستم شما مناسب نیستند.
به طور کلی در نظر داشته باشید که از ابزار مناسب برای کار استفاده کنید. صرف نظر از نمایه سازی یا محک زدن، باید توجه داشت که ابزارها اعداد مختلفی را بین اجراهای مختلف تولید می کنند که به عوامل مختلفی مانند ظرفیت دستگاه شما، حافظه در دسترس و ... بستگی دارد.
یکی از بهترین روش ها برای توضیح این تنوع مورد انتظار، انجام چندگانه است.
بررسی می کند تا تأیید کند که یک رعایت خاص به دلیل ویژگی های محیطی فقط "تصادفی" نبوده است
لینک وبسایت
#monitoring
@code_crafters
❤4👍1
فصل سوم کتاب همزمانی در پایتون
در این فصل نگاهی عمیقتر به سخت افزار بالاخص cpu انداخته
در سیستمهای قدیمی پردازنده بسیار ساده بود اما امروز در ساده ترین دستگاهها چند پردازنده وجود دارد، این مارو سوق میده تا برنامههای موازی بنویسیم ،لذا درک پردازنده به ما کمک شایانی خواهد کرد تا بتونیم برنامههای کاراتری بنویسیم
پردازنده (CPU)
پردازندهها قدیمی مدارهایی بودن که کارهای متفاوتی رو انجام میدادن و عملیات برای دستگاههای جانبی پیش میبردن
اما امروز به شکل مدرنتر خودش بر وظیفه اصلی خودش که همون اجرای دستورالعمل هاست متمرکز شده، پردازنده از اجزای مختلفی تشکیل شده
زمانیکه یک برنامه رو اجرا میکنید دادههای اون بر روی RAM قرار میگیرد که در اتصال با پردازنده هستش اما پردازنده بطور مستقیم به RAM دسترسی ندارد توانایی پردازنده برای محاسبه بسیار سریعتر از توانایی RAM برای انتقال داده به پردازنده هستش، به همین دلیل در پردازندههای مدرن یک یا چند سطح حافظه کش برای افزایش سرعت قرار دارد
کش بعنوان یک میز کار برای پردازنده در نظر بگیرید تصویر اول در کامنتها
کش بسیار سریعتر از RAM هستش و بر روی تراشه پرادزنده قرار دارد ، دستورالعملها رو جهت اجرا در پردازنده را در خود نگه میدارد آنها را بررسی و تحزیه و تحلیل میکند و در صورت نیاز از RAM بازیابی و در حافظه پنهان خود نگه میدارد
تمام دسترسیها و انتقالات موجب تاخیر میشود و کش بابت کاهش این تاخیر قرار گرفته
چرخه اجرای پردازنده
پردازنده یک فرایند مداوم از اجرای دستورالعمل را در مراحل مختلف انجام میده که به عنوان چرخه پردازنده شناخته میشه و در ساده ترین شکل خود در چهار مرحله مختلف به شکل زیر هستش تصویر دوم در کامنتها
توسعه دهندگان دوست دارن همه چیز رو خودشون کنترل کنن(سخت افزار، خطاها، مدیریتها و اشتراک منابع)
با توجه به رشد سخت افزار متناسب با مدیریتهای گوناگون اینکار به یک مسئله پیچیده تبدیل شده، لذا امروزه ما از یک مدیر سیستم عامل که یک رابط بین توسعه دهنده و سخت افزار هست بهره میبریم به مجموعه این رابطها فراخوانی سیستم مینامیم که با در اختیار گذاشتن خدمات و ابزارهایی که با سخت افزار در تعامل هستند برنامههای کاربردی میتوانند از آن استفاده کنند
سیستم عامل از طریق گذرگاه به منابع سخت افزاری دسترسی دارد، ما دو نوع سطح دسترسی داری فضای کاربر که در اختیار کاربر است و فضای سیستم عامل که زیر آن سخت افزار قرار دارد ، کاربر و برنامه های کاربر نمیتوانند مستقیم با سخت افزار ارتباط بگیرن سخت افزار بشکل کامل در کنترل و احاطه کرنل می باشد
با این درک بیایید نگاهی به ساختار موازی سخت افزار بندازیم، پردازنده دارای تعداد زیادی ALU هستش که میتوانند عملیات حسابی رو شکسته و تجزیه کرده و بصورت موازی با هم پیش ببرند گاهی این موازی سازی در سطح عمیقتر تا یک بیت هم پیش میرود
پردازنده چند هستهای نوعی دیگر از همزمانی هستش که هستهها درون یک تراشه هستند و عملکرد انها جدا از هم هستش حتی هنگام دسترسی به حافظه، سیستم عامل هرکدام را مستقل میبیند تفاوت جزیی با چندپردازندگی دارد و در طول این متنها هردو رو یکسان در نظر میگیریم تصویر سوم کامنتها
لینک وبسایت
#concurrency
@code_crafters
در این فصل نگاهی عمیقتر به سخت افزار بالاخص cpu انداخته
در سیستمهای قدیمی پردازنده بسیار ساده بود اما امروز در ساده ترین دستگاهها چند پردازنده وجود دارد، این مارو سوق میده تا برنامههای موازی بنویسیم ،لذا درک پردازنده به ما کمک شایانی خواهد کرد تا بتونیم برنامههای کاراتری بنویسیم
پردازنده (CPU)
پردازندهها قدیمی مدارهایی بودن که کارهای متفاوتی رو انجام میدادن و عملیات برای دستگاههای جانبی پیش میبردن
اما امروز به شکل مدرنتر خودش بر وظیفه اصلی خودش که همون اجرای دستورالعمل هاست متمرکز شده، پردازنده از اجزای مختلفی تشکیل شده
واحدکنترل CU که وظیفه تفسیر دستورالعملهای ماشین را دارد
واحد منطق حسابی ALU عملیات حسابی و بیتی رو انجام میده
به لطف این دو بخش پردازنده امروزی برنامههای پیچیدهتری رو پردازش میکنه
علاوه بر این واحد cache نیز که موجب افزایش بیشتر سرعت در پردازنده شده
زمانیکه یک برنامه رو اجرا میکنید دادههای اون بر روی RAM قرار میگیرد که در اتصال با پردازنده هستش اما پردازنده بطور مستقیم به RAM دسترسی ندارد توانایی پردازنده برای محاسبه بسیار سریعتر از توانایی RAM برای انتقال داده به پردازنده هستش، به همین دلیل در پردازندههای مدرن یک یا چند سطح حافظه کش برای افزایش سرعت قرار دارد
در پستهای قبلی گفتیم که هنگام خرید دستگاهی اندازه پردازنده یکی از عوامل مهم و تاثیر گذار در قدرت اون دستگاه در کنار فرکانس پردازنده هستش، یکی دیگر از موارد مهم در هنگام خرید همین کش هستش که با نمادهای L1,L2,L3 بر روی دستگاهها نوشته شده و بالا بودن مقدار آن که مقداری مگابایتی هستش یکی موضوعات حائز اهمیت در انتخاب دستگاه بهتر به شمار می رود
کش بعنوان یک میز کار برای پردازنده در نظر بگیرید تصویر اول در کامنتها
کش بسیار سریعتر از RAM هستش و بر روی تراشه پرادزنده قرار دارد ، دستورالعملها رو جهت اجرا در پردازنده را در خود نگه میدارد آنها را بررسی و تحزیه و تحلیل میکند و در صورت نیاز از RAM بازیابی و در حافظه پنهان خود نگه میدارد
تمام دسترسیها و انتقالات موجب تاخیر میشود و کش بابت کاهش این تاخیر قرار گرفته
چرخه اجرای پردازنده
پردازنده یک فرایند مداوم از اجرای دستورالعمل را در مراحل مختلف انجام میده که به عنوان چرخه پردازنده شناخته میشه و در ساده ترین شکل خود در چهار مرحله مختلف به شکل زیر هستش تصویر دوم در کامنتها
۱- واکشی. CU دستورالعمل را از RAM یا کش واکشی می کند و آن را در CPU کپی می کند. در این فرآیند، CU از شمارندههای مختلفی استفاده میکند تا بفهمد چه دستورالعملی باید واکشی شود و کجا آن را پیدا کند
۲- دستورالعمل که قبلاً واکشی شده رمزگشایی شده و برای پردازش ارسال می شود
انواع مختلف دستورالعمل ها کارهای متفاوتی انجام می دهند، بنابراین بسته به نوع دستورالعمل و کد عملیات، باید بدانیم دستورالعمل ها به کدام واحدهای پردازشی ارسال می شود
۳- سپس دستور محاسبات به ALU منتقل می شود و اجرا را شروع می کند
۴- پس از تکمیل دستورالعمل، نتیجه در RAM نوشته می شود و دستور بعدی اجرای خود را آغاز می کند
سپس پردازنده به مرحله 1 برمی گردد تا زمانی که دیگر دستورالعملی برای واکشی باقی نماند
توسعه دهندگان دوست دارن همه چیز رو خودشون کنترل کنن(سخت افزار، خطاها، مدیریتها و اشتراک منابع)
با توجه به رشد سخت افزار متناسب با مدیریتهای گوناگون اینکار به یک مسئله پیچیده تبدیل شده، لذا امروزه ما از یک مدیر سیستم عامل که یک رابط بین توسعه دهنده و سخت افزار هست بهره میبریم به مجموعه این رابطها فراخوانی سیستم مینامیم که با در اختیار گذاشتن خدمات و ابزارهایی که با سخت افزار در تعامل هستند برنامههای کاربردی میتوانند از آن استفاده کنند
سیستم عامل از طریق گذرگاه به منابع سخت افزاری دسترسی دارد، ما دو نوع سطح دسترسی داری فضای کاربر که در اختیار کاربر است و فضای سیستم عامل که زیر آن سخت افزار قرار دارد ، کاربر و برنامه های کاربر نمیتوانند مستقیم با سخت افزار ارتباط بگیرن سخت افزار بشکل کامل در کنترل و احاطه کرنل می باشد
با این درک بیایید نگاهی به ساختار موازی سخت افزار بندازیم، پردازنده دارای تعداد زیادی ALU هستش که میتوانند عملیات حسابی رو شکسته و تجزیه کرده و بصورت موازی با هم پیش ببرند گاهی این موازی سازی در سطح عمیقتر تا یک بیت هم پیش میرود
پردازنده چند هستهای نوعی دیگر از همزمانی هستش که هستهها درون یک تراشه هستند و عملکرد انها جدا از هم هستش حتی هنگام دسترسی به حافظه، سیستم عامل هرکدام را مستقل میبیند تفاوت جزیی با چندپردازندگی دارد و در طول این متنها هردو رو یکسان در نظر میگیریم تصویر سوم کامنتها
لینک وبسایت
#concurrency
@code_crafters
👍2
معماری متقارن چند پردازشی SMP
حافظه معمولا سرعت پایینتری نسبت به پردازندهها دارن که این خود موجب تاخیر میشود به همین دلیل امروزه از سیستمهای چندپردازندهای از SMP استفاده میکنند که با یک فضای آدرس واحد به حافظه مشترک متصل شده و تحت یک سیستم عامل کار میکند، در این معماری پردازندهها توسط یک شبکه ارتباطی از طریق گذرگاه سیستم به هم متصل میشن، هرچند این شبکهها سریع هستن اما اگه پردازندهها نیاز به تبادل با هم داشته باشند از طریق چندکانال صورت میگیرد که انی نیست و در صورت افزایش تعداد منابع در حال تعامل فاصله بینشون موجب تاخیر میشه مجدد، بنابراین در این معماری هر پردازنده کش خصوصی خود را دارد تا ترافیک system bus را کاهش داده و تاخیر کمتری روی میده تصویر اول در کامنتها
توسعه پروتکل MESI مشکل انسجام حافظه رو حل کرد ،با ردیابی وضعیت هر کش موجب میشه همه پردازندهها دید ثابتی از داده داشته باشند
تنها راه فراتر رفتن از SMP سیستمهای توزیع شده هست که در یک شبکه باهم در ارتباط داشته باشند و بدین شکل هر سیستم بعنوان یک خوشه حافظه و کش خودش رو داره و بر بقیه تاثیر نمیزاره
تصویر دوم در کامنتها
طبقه بندی رایانه های موازی بر اساس دستورالعمل ها و جریان داده ها.
دو دسته SISD , MISD مناسب مواری سازی نیستند کار کرده انها بگونهای هستش که یک بلوک از دستورالعملهارو میگیرن و تنها همون رو پیش میبرند
در دسته سوم، یک دستورالعمل، داده های متعدد (SIMD) است که دارای واحدهای کنترل مشترک در چندین هسته است، با این طراحی، تنها یک دستور را می توان به طور همزمان بر روی تمام منابع پردازشی موجود اجرا کرد، که اجازه می دهد همان عملیات روی مجموعه بزرگی از عناصر داده به طور همزمان انجام شود، با این حال، مجموعه دستورالعمل در ماشینهای SIMD محدود است، و آنها را برای حل مسائل خاصی که نیاز به قدرت محاسباتی بالایی دارند اما تطبیقپذیری زیادی ندارند، مناسب میسازد، واحدهای پردازش گرافیکی (GPU) نمونه شناخته شده SIMD امروزه هستند
دسته چهارم دستورالعمل های چندگانه، داده های چندگانه (MIMD) است، در اینجا، هر منبع پردازش یک واحد کنترل مستقل دارد
بنابراین، به انواع خاصی از دستورالعمل ها محدود نمی شود و دستورالعمل های مختلف را به طور مستقل بر روی یک بلوک جداگانه از داده ها اجرا می کند، بنابراین، شامل معماری هایی با چندین هسته، چندین CPU یا حتی چندین ماشین می شود تا وظایف مختلف را بتوان به طور همزمان در چندین دستگاه مختلف اجرا کرد
پردازندههای گرافیکی برای کارهای محاسباتی تکراری و موازی مانند پردازش تصویر و ویدئو، یادگیری ماشین، شبیهسازیهای مالی و بسیاری دیگر از محاسبات علمی مناسب هستند. عملیاتی مانند جمع و ضرب ماتریس به راحتی با استفاده از یک GPU انجام می شود زیرا اکثر این عملیات در سلول های ماتریس مستقل از یکدیگر و مشابه هستند و بنابراین می توان آنها را موازی کرد تصویر سوم در کامنتها
لینک وبسایت
#concurrency
@code_crafters
حافظه معمولا سرعت پایینتری نسبت به پردازندهها دارن که این خود موجب تاخیر میشود به همین دلیل امروزه از سیستمهای چندپردازندهای از SMP استفاده میکنند که با یک فضای آدرس واحد به حافظه مشترک متصل شده و تحت یک سیستم عامل کار میکند، در این معماری پردازندهها توسط یک شبکه ارتباطی از طریق گذرگاه سیستم به هم متصل میشن، هرچند این شبکهها سریع هستن اما اگه پردازندهها نیاز به تبادل با هم داشته باشند از طریق چندکانال صورت میگیرد که انی نیست و در صورت افزایش تعداد منابع در حال تعامل فاصله بینشون موجب تاخیر میشه مجدد، بنابراین در این معماری هر پردازنده کش خصوصی خود را دارد تا ترافیک system bus را کاهش داده و تاخیر کمتری روی میده تصویر اول در کامنتها
جالب ترین ویژگی SMP این است که وجود چندین پردازنده برای کاربر نهایی شفاف است. سیستم عامل از زمانبندی فرآیندها در تک تک پردازندهها و همگامسازی بین آن پردازندهها مراقبت میکند، با این حال، در چنین سیستم هایی، افزایش تعداد پردازنده های متصل به یک گذرگاه سیستم مشترک، آن را به یک گلوگاه تبدیل می کند. این مشکل با انسجام کش بدتر می شود، جایی که چندین هسته پردازشگر سلسله مراتب حافظه یکسانی را به اشتراک می گذارند اما کش های داده و دستورالعمل L1 خود را دارند
توسعه پروتکل MESI مشکل انسجام حافظه رو حل کرد ،با ردیابی وضعیت هر کش موجب میشه همه پردازندهها دید ثابتی از داده داشته باشند
تنها راه فراتر رفتن از SMP سیستمهای توزیع شده هست که در یک شبکه باهم در ارتباط داشته باشند و بدین شکل هر سیستم بعنوان یک خوشه حافظه و کش خودش رو داره و بر بقیه تاثیر نمیزاره
تصویر دوم در کامنتها
طبقه بندی رایانه های موازی بر اساس دستورالعمل ها و جریان داده ها.
دو دسته SISD , MISD مناسب مواری سازی نیستند کار کرده انها بگونهای هستش که یک بلوک از دستورالعملهارو میگیرن و تنها همون رو پیش میبرند
در دسته سوم، یک دستورالعمل، داده های متعدد (SIMD) است که دارای واحدهای کنترل مشترک در چندین هسته است، با این طراحی، تنها یک دستور را می توان به طور همزمان بر روی تمام منابع پردازشی موجود اجرا کرد، که اجازه می دهد همان عملیات روی مجموعه بزرگی از عناصر داده به طور همزمان انجام شود، با این حال، مجموعه دستورالعمل در ماشینهای SIMD محدود است، و آنها را برای حل مسائل خاصی که نیاز به قدرت محاسباتی بالایی دارند اما تطبیقپذیری زیادی ندارند، مناسب میسازد، واحدهای پردازش گرافیکی (GPU) نمونه شناخته شده SIMD امروزه هستند
دسته چهارم دستورالعمل های چندگانه، داده های چندگانه (MIMD) است، در اینجا، هر منبع پردازش یک واحد کنترل مستقل دارد
بنابراین، به انواع خاصی از دستورالعمل ها محدود نمی شود و دستورالعمل های مختلف را به طور مستقل بر روی یک بلوک جداگانه از داده ها اجرا می کند، بنابراین، شامل معماری هایی با چندین هسته، چندین CPU یا حتی چندین ماشین می شود تا وظایف مختلف را بتوان به طور همزمان در چندین دستگاه مختلف اجرا کرد
پردازندههای گرافیکی برای کارهای محاسباتی تکراری و موازی مانند پردازش تصویر و ویدئو، یادگیری ماشین، شبیهسازیهای مالی و بسیاری دیگر از محاسبات علمی مناسب هستند. عملیاتی مانند جمع و ضرب ماتریس به راحتی با استفاده از یک GPU انجام می شود زیرا اکثر این عملیات در سلول های ماتریس مستقل از یکدیگر و مشابه هستند و بنابراین می توان آنها را موازی کرد تصویر سوم در کامنتها
لینک وبسایت
#concurrency
@code_crafters
👍1
CodeCrafters
مراسم پیشوازی از نوروز در مناطق کردستان، فرهنگی دیرینه پیاپیش نوروز پیروز #free @code_crafters
یچی جالب راجب فرهنگ رنگ لباس زنان بهتون بگم
در این مراسمات سه نوع رنگ لباس برای زنان حائز اهمیت هست که صد البته پسر
رنگ لباس سیاه برای دختران به معنای عزادار بودن بابت یکی از نزدیکانش میباشد که میتونه شوهرش یا معشوقهش باشه و با پوشیدن این لباس به بقیه اعلان میکنه که فعلا در دسترس برقراری ارتباط نیست و علاقهای نداره
رنگ لباس زرد برای دختران به معنای داشتن معشوقه و یا نامزد هستش و این رو به بقیه میرسونه که نسبت به یکنفر تعهد عاشقانه داره
رنگ قرمز برای لباس دختران به معنای مجرد بودن و آمادگی انتخاب برای یک رابطه عاشقانه و ازدواج هستش (پسرها برن شانس خودشون رو امتحان کنن) نکته جالب اینجا اگه دختری لباس قرمز بپوشه و در این مراسمات خودش رو به پسری نشون بده و جلوش چندبار ظاهر بشه به این معناست که نسبت به اون پسر علاقه داره و ازش میخواد که اگه اون هم حسی داره بابت پیشنهاد پیش قدم بشه
دیگه از خاطرات این فرهنگ دیرینه نگیم براتون😅😅😅😅
در این مراسمات سه نوع رنگ لباس برای زنان حائز اهمیت هست که صد البته پسر
رنگ لباس سیاه برای دختران به معنای عزادار بودن بابت یکی از نزدیکانش میباشد که میتونه شوهرش یا معشوقهش باشه و با پوشیدن این لباس به بقیه اعلان میکنه که فعلا در دسترس برقراری ارتباط نیست و علاقهای نداره
رنگ لباس زرد برای دختران به معنای داشتن معشوقه و یا نامزد هستش و این رو به بقیه میرسونه که نسبت به یکنفر تعهد عاشقانه داره
رنگ قرمز برای لباس دختران به معنای مجرد بودن و آمادگی انتخاب برای یک رابطه عاشقانه و ازدواج هستش (پسرها برن شانس خودشون رو امتحان کنن) نکته جالب اینجا اگه دختری لباس قرمز بپوشه و در این مراسمات خودش رو به پسری نشون بده و جلوش چندبار ظاهر بشه به این معناست که نسبت به اون پسر علاقه داره و ازش میخواد که اگه اون هم حسی داره بابت پیشنهاد پیش قدم بشه
دیگه از خاطرات این فرهنگ دیرینه نگیم براتون😅😅😅😅
🫡15❤2🔥2🤔2🥱2😁1
داکر و ۱۳ ترفند مهم در آن
داکر به یک ابزار مهم خط لوله برای توسعه، استقرار و تست برنامه در دنیای مدرن مهندسی تبدیل شده، در حالیکه بیشتر کاربران با مسائل پایه و دستورات اولیه آن اشنا هستند اینجا وجود داره یکسری ویژگیها و ترفندهایی که کار کردن رو ساده و توسعه رو بهتر میکنه
در اینجا 13 ترفند داکر رو با موضوعیتی برای مهندسین ارشد بررسی میکنیم که فراتر از اصول اولیه هستند و راه های قدرتمند و کمتر شناخته شده ای را برای استفاده از داکر ارائه معرفی میکنیم
1-ساخت چند مرحلهای برای تصاویر (image) کارآمد
ساختهای چند مرحلهای در داکر یک تکنیک قدرتمند برای ایجاد تصاویری ناب و ایمنتر با جدا کردن محیط ساخت از محیط تولید در همان داکرفایل است
ساخت چندمرحلهای چیست
ساخت چندمرحلهای در ساخت تصاویر این امکان رو به ما میدن که در داکر فایل از چند دستور FROM استفاده کنیم، هر دستورالعمل FROM میتونه از بیس متفاوتی استفاده کنه و هر استیج نام خودش رو داشته باشه، بدینگونه شما میتونید مصنوعات رو از یک استیج به دیگری کپی کرده و هر قسمت رو که لازم ندارید پشت سر بگذارید
این مثال یک ساخت ساده چند مرحله ای برای یک برنامه Go را نشان می دهد. مرحله ساخت از یک تصویر گولنگ برای کامپایل برنامه استفاده می کند و مرحله نهایی یک تصویر سبک وزن alpine رو می سازه که فقط شامل باینری کامپایل شده هستش
چه وقتی شما از ساخت چند مرحلهای استفاده میکنید
بهترین رویکرد
بهینه سازی استفاده از کش ساخت:
دستورات کپی را سفارشی کنید و با دقت اجرا کنید تا ذخیره لایه ها به حداکثر برسد
کوچک کردن اندازه تصویر نهایی: فقط مصنوعات مورد نیاز برای اجرای برنامه را در تصویر نهایی کپی کنید
مراحل ساخت برچسب: از مراحل نامگذاری شده برای بهبود خوانایی و قابلیت نگهداری داکرفایل خود استفاده کنید
دامهای رایج
پیچیدگی بیش از حد: از ساختهای پیچیده چند مرحلهای غیرضروری که میتواند منجر به نگهداری داکرفایل دشوار شود، اجتناب کنید
نادیده گرفتن زمینه ساخت: حواستان به زمینه ساختی باشد که به daemon داکر ارسال می کنید، زیرا زمینه های بزرگ غیر ضروری می توانند روند ساخت را کند کنند
لینک وبسایت
#docker
@code_crafters
داکر به یک ابزار مهم خط لوله برای توسعه، استقرار و تست برنامه در دنیای مدرن مهندسی تبدیل شده، در حالیکه بیشتر کاربران با مسائل پایه و دستورات اولیه آن اشنا هستند اینجا وجود داره یکسری ویژگیها و ترفندهایی که کار کردن رو ساده و توسعه رو بهتر میکنه
در اینجا 13 ترفند داکر رو با موضوعیتی برای مهندسین ارشد بررسی میکنیم که فراتر از اصول اولیه هستند و راه های قدرتمند و کمتر شناخته شده ای را برای استفاده از داکر ارائه معرفی میکنیم
1-ساخت چند مرحلهای برای تصاویر (image) کارآمد
ساختهای چند مرحلهای در داکر یک تکنیک قدرتمند برای ایجاد تصاویری ناب و ایمنتر با جدا کردن محیط ساخت از محیط تولید در همان داکرفایل است
ساخت چندمرحلهای چیست
ساخت چندمرحلهای در ساخت تصاویر این امکان رو به ما میدن که در داکر فایل از چند دستور FROM استفاده کنیم، هر دستورالعمل FROM میتونه از بیس متفاوتی استفاده کنه و هر استیج نام خودش رو داشته باشه، بدینگونه شما میتونید مصنوعات رو از یک استیج به دیگری کپی کرده و هر قسمت رو که لازم ندارید پشت سر بگذارید
# Syntax for multi-stage builds
# Stage 1: Build the application
FROM golang:1.15 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# Stage 2: Create the final image
FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
ENTRYPOINT ["/app/myapp"]
این مثال یک ساخت ساده چند مرحله ای برای یک برنامه Go را نشان می دهد. مرحله ساخت از یک تصویر گولنگ برای کامپایل برنامه استفاده می کند و مرحله نهایی یک تصویر سبک وزن alpine رو می سازه که فقط شامل باینری کامپایل شده هستش
چه وقتی شما از ساخت چند مرحلهای استفاده میکنید
کاهش اندازه تصویر: زمانی که فرآیند ساخت برنامه شما شامل کامپایل کد یا شامل وابستگی های زمان ساخت است که در زمان اجرا مورد نیاز نیستند
افزایش امنیت: برای به حداقل رساندن سطح حمله تصویر نهایی خود با حذف ابزارها و فایل هایی که برای اجرای برنامه مورد نیاز نیستند
جداسازی محیط های ساخت: زمانی که نیاز به ساخت برنامه های کاربردی در یک محیط خاص دارید اما می خواهید آنها را در محیط دیگری اجرا کنید.
بهترین رویکرد
بهینه سازی استفاده از کش ساخت:
دستورات کپی را سفارشی کنید و با دقت اجرا کنید تا ذخیره لایه ها به حداکثر برسد
کوچک کردن اندازه تصویر نهایی: فقط مصنوعات مورد نیاز برای اجرای برنامه را در تصویر نهایی کپی کنید
مراحل ساخت برچسب: از مراحل نامگذاری شده برای بهبود خوانایی و قابلیت نگهداری داکرفایل خود استفاده کنید
دامهای رایج
پیچیدگی بیش از حد: از ساختهای پیچیده چند مرحلهای غیرضروری که میتواند منجر به نگهداری داکرفایل دشوار شود، اجتناب کنید
نادیده گرفتن زمینه ساخت: حواستان به زمینه ساختی باشد که به daemon داکر ارسال می کنید، زیرا زمینه های بزرگ غیر ضروری می توانند روند ساخت را کند کنند
لینک وبسایت
#docker
@code_crafters
❤2👍1
2-له کردن (Squashing) لایههای ایمیج داکر
له کردن لایه های تصویر در داکر تکنیکی است که می تواند اندازه تصاویر داکر شما را به میزان قابل توجهی کاهش دهد.با ترکیب تمام لایه های تولید شده در طول ساخت تصویر در یک لایه، میتوانید ذخیره سازی و توزیع تصاویر داکر خود را بهینه کنید
له کردن چیست
هنگامی که یک تصویر داکر می سازید، هر دستورالعمل در داکرفایل یک لایه جدید ایجاد می کند.این لایهها میتوانند دادههای غیرضروری را جمعآوری کنند که منجر به ایجاد تصاویر متورم میشود. (له کردن) Squashing تعداد لایه ها را در تصاویر داکر با ادغام آنها در یک لایه کاهش می دهد، که می تواند به حداقل رساندن اندازه تصویر کمک کند
چگونه از له کردن استفاده کنیم
برای له کردن لایههای تصویر، میتوانید هنگام ساخت تصاویر خود با فعال کردن Docker BuildKit از فلگ sqash-- استفاده کنید
چه وقتی از له کردن استفاده کنیم
بهینه سازی اندازه تصویر: زمانی که نیاز به کاهش اندازه تصویر نهایی داکر خود دارید، از squashing استفاده کنید، به خصوص هنگام توزیع تصاویر در یک شبکه یا ذخیره آنها در یک رجیستری
ساده سازی لایه های تصویر: اگر داکرفایل شما حاوی دستورالعمل های اجرا یا کپی زیادی است که تعداد لایه ها و اندازه کلی تصویر را افزایش می دهد
بهترین رویکرد
له کردن انتخابی: در نظر بگیرید که کدام تصاویر بیشتر از له کردن سود می برند. ممکن است برخی از لایهها برای اهداف ذخیرهسازی، بهویژه در حین توسعه، بدون شکست باقی بمانند.
مراقب ذخیره سازی باشید: Squashing می تواند بر مکانیسم کش لایه Docker تأثیر بگذارد. له کردن مکرر ممکن است منجر به زمان ساخت طولانیتر شود، زیرا داکر نمیتواند لایههای میانی را به طور موثر کش کند.
پیامدهای امنیتی: بدانید که له کردن ممکن است تاریخچه یک تصویر را پنهان کند. اطمینان حاصل کنید که لایه نهایی له شده سهوا حاوی داده های حساسی نیست که در لایه های میانی دور ریخته می شوند.
دامهای رایج
استفاده بیش از حد در طول توسعه: له کردن پس از هر ساخت در طول توسعه می تواند به دلیل از بین رفتن مزایای ذخیره سازی، زمان ساخت را به طور قابل توجهی کاهش دهد.
نادیده گرفتن وضعیت آزمایشی: به یاد داشته باشید که ویژگی squash آزمایشی است و ممکن است در نسخهها یا پیکربندیهای مختلف داکر به طور مداوم رفتار نکند
لینک وبسایت
#docker
@code_crafters
له کردن لایه های تصویر در داکر تکنیکی است که می تواند اندازه تصاویر داکر شما را به میزان قابل توجهی کاهش دهد.با ترکیب تمام لایه های تولید شده در طول ساخت تصویر در یک لایه، میتوانید ذخیره سازی و توزیع تصاویر داکر خود را بهینه کنید
له کردن چیست
هنگامی که یک تصویر داکر می سازید، هر دستورالعمل در داکرفایل یک لایه جدید ایجاد می کند.این لایهها میتوانند دادههای غیرضروری را جمعآوری کنند که منجر به ایجاد تصاویر متورم میشود. (له کردن) Squashing تعداد لایه ها را در تصاویر داکر با ادغام آنها در یک لایه کاهش می دهد، که می تواند به حداقل رساندن اندازه تصویر کمک کند
چگونه از له کردن استفاده کنیم
برای له کردن لایههای تصویر، میتوانید هنگام ساخت تصاویر خود با فعال کردن Docker BuildKit از فلگ sqash-- استفاده کنید
# Enable Docker BuildKit
export DOCKER_BUILDKIT=1
# Build and squash the image
docker build --tag myapp:latest --squash .
چه وقتی از له کردن استفاده کنیم
بهینه سازی اندازه تصویر: زمانی که نیاز به کاهش اندازه تصویر نهایی داکر خود دارید، از squashing استفاده کنید، به خصوص هنگام توزیع تصاویر در یک شبکه یا ذخیره آنها در یک رجیستری
ساده سازی لایه های تصویر: اگر داکرفایل شما حاوی دستورالعمل های اجرا یا کپی زیادی است که تعداد لایه ها و اندازه کلی تصویر را افزایش می دهد
بهترین رویکرد
له کردن انتخابی: در نظر بگیرید که کدام تصاویر بیشتر از له کردن سود می برند. ممکن است برخی از لایهها برای اهداف ذخیرهسازی، بهویژه در حین توسعه، بدون شکست باقی بمانند.
مراقب ذخیره سازی باشید: Squashing می تواند بر مکانیسم کش لایه Docker تأثیر بگذارد. له کردن مکرر ممکن است منجر به زمان ساخت طولانیتر شود، زیرا داکر نمیتواند لایههای میانی را به طور موثر کش کند.
پیامدهای امنیتی: بدانید که له کردن ممکن است تاریخچه یک تصویر را پنهان کند. اطمینان حاصل کنید که لایه نهایی له شده سهوا حاوی داده های حساسی نیست که در لایه های میانی دور ریخته می شوند.
دامهای رایج
استفاده بیش از حد در طول توسعه: له کردن پس از هر ساخت در طول توسعه می تواند به دلیل از بین رفتن مزایای ذخیره سازی، زمان ساخت را به طور قابل توجهی کاهش دهد.
نادیده گرفتن وضعیت آزمایشی: به یاد داشته باشید که ویژگی squash آزمایشی است و ممکن است در نسخهها یا پیکربندیهای مختلف داکر به طور مداوم رفتار نکند
لینک وبسایت
#docker
@code_crafters
❤2
3-docker buildkit secret
داکر BuildKit راه امن تری را برای رسیدگی به سکرتها در طول فرآیند ساخت معرفی می کند و چالش استفاده از منابع خصوصی را بدون افشای آنها در تصویر نهایی برطرف می کند. قابلیتهای مدیریت مخفی BuildKit به شما این امکان را میدهد که اطلاعات حساس را در طول ساخت بدون باقی ماندن ردی در لایههای تصویر ارسال کنید.
داکر buildkit سکرت چیست
یک ویژگی سیستم ساخت داکر buildkit است. این به شما این امکان رو میده تا اطلاعات مخفی و سکرت (مانند رمزهای عبور، کلیدهای خصوصی یا نشانه های API) را به طور ایمن به فرآیند ساخت منتقل کنید. این سکرتها در تصویر نهایی یا در لایههای میانی ذخیره نمیشوند و فرآیند ساخت شما را امنتر میکنند
چگونه از داکر buildkit سکرت استفاده کنیم
برای استفاده از داکر BuildKit سکرت، ابتدا مطمئن شوید که Docker BuildKit فعال است.می توانید این کار را با تنظیم متغیر محیطی DOCKER_BUILDKIT=1 انجام دهید. سپس، از فلگ secret-- در طول فرآیند ساخت برای ارائه رازها استفاده کنید
چه وقتی از داکر buildkit سکرت استفاده کنیم
دسترسی به مخازن خصوصی Git: زمانی که ساخت شما نیاز به pull کردن وابستگی ها از مخازن خصوصی دارد(یک پکیج خصوصی توسعه دادهاید و در اکانت خودتون گذاشتهاید)
استفاده از کلیدهای خصوصی: زمانی که نیاز به استفاده از کلیدهای خصوصی برای دسترسی SSH یا رمزگشایی فایل ها در حین ساخت دارید
توکن های API: زمانی که فرآیند ساخت شما شامل دسترسی به API هایی است که نیاز به احراز هویت دارند
بهترین رویکرد
به حداقل رساندن قرار گرفتن در معرض مخفیانه: فقط در صورت لزوم از اسرار استفاده کنید و از ثبت یا افشای آنها در مراحل میانی خودداری کنید
اسکوپهای سکرت: اسرار را به وضوح تعریف کرده و به مراحل ساخت خاصی که در آن مورد نیاز است، بسط دهید و خطر مواجهه را کاهش دهید
نسخه pinning : همیشه هنگام استفاده از ویژگیهای BuildKit، نسخه نحو را در داکر خود پین کنید تا از سازگاری و پیشبینیپذیری اطمینان حاصل کنید.
دامهای رایج:
کدگذاری بصورت سخت (hardcoding): از کدگذاری بصورتسخت یا استفاده از روشهای منسوخ (مثلاً ARG برای انتقال سکرت) که ممکن است اطلاعات حساسی را در لایههای تصویر باقی بگذارند، خودداری کنید
در شرف پاکسازی: با بازرسی لایههای نهایی یا ایجاد سهوا لایههای ذخیرهسازی با دادههای مخفی، مطمئن شوید که هیچ باقیمانده مخفی در تصویر باقی نمانده است
توضیحات تکمیلی
ویژگی buildkit در نسخههای جدید داکر و داکرکامپوز بصورت پیش فرض فعال می باشد که با تکنیکهای خاصی سرعت ایجاد تصاویر رو افزایش میده
در خصوص pinning قابلیتی که به شما این امکان رو میده تا از نسخههای خاصی از ابزارها و وابستگیها استفاده کنند، که در یک فایل با نام build.yml نوشته میشه و در کنار داکرفایل قرار میگیرد برای مثال در پایتون و جنگو داکرفایل ما بصورت زیر می باشد
لینک وبسایت
#docker
@code_crafters
داکر BuildKit راه امن تری را برای رسیدگی به سکرتها در طول فرآیند ساخت معرفی می کند و چالش استفاده از منابع خصوصی را بدون افشای آنها در تصویر نهایی برطرف می کند. قابلیتهای مدیریت مخفی BuildKit به شما این امکان را میدهد که اطلاعات حساس را در طول ساخت بدون باقی ماندن ردی در لایههای تصویر ارسال کنید.
داکر buildkit سکرت چیست
یک ویژگی سیستم ساخت داکر buildkit است. این به شما این امکان رو میده تا اطلاعات مخفی و سکرت (مانند رمزهای عبور، کلیدهای خصوصی یا نشانه های API) را به طور ایمن به فرآیند ساخت منتقل کنید. این سکرتها در تصویر نهایی یا در لایههای میانی ذخیره نمیشوند و فرآیند ساخت شما را امنتر میکنند
چگونه از داکر buildkit سکرت استفاده کنیم
برای استفاده از داکر BuildKit سکرت، ابتدا مطمئن شوید که Docker BuildKit فعال است.می توانید این کار را با تنظیم متغیر محیطی DOCKER_BUILDKIT=1 انجام دهید. سپس، از فلگ secret-- در طول فرآیند ساخت برای ارائه رازها استفاده کنید
# Enable Docker BuildKit
export DOCKER_BUILDKIT=1
# Build with a secret
docker build --secret id=mysecret,src=/path/to/secret/file.txt -t myapp:latest .
چه وقتی از داکر buildkit سکرت استفاده کنیم
دسترسی به مخازن خصوصی Git: زمانی که ساخت شما نیاز به pull کردن وابستگی ها از مخازن خصوصی دارد(یک پکیج خصوصی توسعه دادهاید و در اکانت خودتون گذاشتهاید)
استفاده از کلیدهای خصوصی: زمانی که نیاز به استفاده از کلیدهای خصوصی برای دسترسی SSH یا رمزگشایی فایل ها در حین ساخت دارید
توکن های API: زمانی که فرآیند ساخت شما شامل دسترسی به API هایی است که نیاز به احراز هویت دارند
بهترین رویکرد
به حداقل رساندن قرار گرفتن در معرض مخفیانه: فقط در صورت لزوم از اسرار استفاده کنید و از ثبت یا افشای آنها در مراحل میانی خودداری کنید
اسکوپهای سکرت: اسرار را به وضوح تعریف کرده و به مراحل ساخت خاصی که در آن مورد نیاز است، بسط دهید و خطر مواجهه را کاهش دهید
نسخه pinning : همیشه هنگام استفاده از ویژگیهای BuildKit، نسخه نحو را در داکر خود پین کنید تا از سازگاری و پیشبینیپذیری اطمینان حاصل کنید.
دامهای رایج:
کدگذاری بصورت سخت (hardcoding): از کدگذاری بصورتسخت یا استفاده از روشهای منسوخ (مثلاً ARG برای انتقال سکرت) که ممکن است اطلاعات حساسی را در لایههای تصویر باقی بگذارند، خودداری کنید
در شرف پاکسازی: با بازرسی لایههای نهایی یا ایجاد سهوا لایههای ذخیرهسازی با دادههای مخفی، مطمئن شوید که هیچ باقیمانده مخفی در تصویر باقی نمانده است
توضیحات تکمیلی
ویژگی buildkit در نسخههای جدید داکر و داکرکامپوز بصورت پیش فرض فعال می باشد که با تکنیکهای خاصی سرعت ایجاد تصاویر رو افزایش میده
در خصوص pinning قابلیتی که به شما این امکان رو میده تا از نسخههای خاصی از ابزارها و وابستگیها استفاده کنند، که در یک فایل با نام build.yml نوشته میشه و در کنار داکرفایل قرار میگیرد برای مثال در پایتون و جنگو داکرفایل ما بصورت زیر می باشد
FROM python:3.9و فایل build.yml ما بصورت زیر خواهد بود
RUN pip install --upgrade pip
RUN pip install django==4.1.5
COPY . /app
CMD python manage.py runserver 0.0.0.0:8000
build:این فایل محدودیت استفاده از ابزار و نسخه خاص رو بر روی داکر ایجاد میکند، موجب افزایش امنیت و رعایت وابستگیها میشه و ایمیجهای تکرار شونده رو براتون بوجود میاره ، اما انعطاف شمارو در ساخت ایمیج پایین میاره
pins:
- name: python
version: "3.9"
- name: pip
version: "22.3.1"
- name: django
version: "4.1.5"
لینک وبسایت
#docker
@code_crafters
❤2👎1
4-اهرم dockerignore.
فایل .dockerignore نقش مهمی در بهینهسازی ساختهای Docker بازی میکند، زیرا به شما امکان میدهد الگوهایی را مشخص کنید که فایلها و دایرکتوریها را از متن ارسال شده به Daemon داکر حذف میکند. این مکانیسم می تواند به طور قابل توجهی روند ساخت را سرعت ببخشد، اندازه زمینه ساخت را کاهش دهد و با حذف فایل های حساس، امنیت را افزایش دهد
این dockerignore چیست
مانند gitignore.، فایل .dockerignore به داکر میگوید کدام فایلها و دایرکتوریها را هنگام ساختن یک تصویر نادیده بگیرد.این امر به ویژه مهم است زیرا هر فایلی که به عنوان بخشی از زمینه ساخت به Daemon داکر ارسال می شود، می تواند زمان ساخت و پیچیدگی غیر ضروری را به خصوص در پروژه های بزرگ افزایش دهد.
استفاده از dockerignore
یک فایل .dockerignore در ریشه پروژه خود، جایی که Dockerfile شما قرار دارد، ایجاد کنید. در این فایل، الگوهایی را برای فایلها و دایرکتوریها مشخص کنید تا از زمینه ساخت Docker حذف شوند.
نمونه ای از فایل .dockerignore
چه وقتی از dockerignore استفاده کنیم
مخازن بزرگ: برای پروژه هایی با حجم زیاد داده، به خصوص آنهایی که برای ساخت یا زمان اجرا مورد نیاز نیستند
اطلاعات حساس: برای حذف فایلهای حاوی سکرتها(env.) یا اطلاعات حساسی که نباید در زمینه ساخت Docker گنجانده شوند
دایرکتوریهای وابستگی: برای زبانهایی که وابستگیها را در فهرستهای محلی دانلود میکنند (مانند venv در پایتون)، که اگر در حین ساخت، وابستگیها را نصب میکنید، در زمینه ساخت مورد نیاز نیستند
بهترین رویکرد
مرتباً مرور کنید: بهطور دورهای فایل .dockerignore خود را بررسی کنید تا مطمئن شوید که با ساختار و الزامات پروژه شما بهروز است
الگوهای واضح: از الگوهای صریح استفاده کنید تا فایل ها و دایرکتوری های مورد نظر را دقیقاً مطابقت دهند و از حذف ناخواسته اجتناب کنید
حفظ امنیت: از .dockerignore برای تقویت امنیت با اطمینان از اینکه فقط فایل های لازم در زمینه ساخت شما گنجانده شده است، استفاده کنید
دامهای رایج
نادیده گرفتن .dockerignore: عدم استفاده یا پیکربندی صحیح فایل .dockerignore می تواند منجر به ساخت کند، اندازه تصویر بزرگتر و گنجاندن احتمالی اطلاعات حساس شود
حذف بیش از حد: در حالی که حذف فایلهای غیر ضروری مهم است، مراقب باشید فایلهایی را که برای فرآیند ساخت ضروری هستند حذف نکنید، که میتواند منجر به شکست ساخت یا رفتار نادرست تصویر شود.
لینک وبسایت
#docker
@code_crafters
فایل .dockerignore نقش مهمی در بهینهسازی ساختهای Docker بازی میکند، زیرا به شما امکان میدهد الگوهایی را مشخص کنید که فایلها و دایرکتوریها را از متن ارسال شده به Daemon داکر حذف میکند. این مکانیسم می تواند به طور قابل توجهی روند ساخت را سرعت ببخشد، اندازه زمینه ساخت را کاهش دهد و با حذف فایل های حساس، امنیت را افزایش دهد
این dockerignore چیست
مانند gitignore.، فایل .dockerignore به داکر میگوید کدام فایلها و دایرکتوریها را هنگام ساختن یک تصویر نادیده بگیرد.این امر به ویژه مهم است زیرا هر فایلی که به عنوان بخشی از زمینه ساخت به Daemon داکر ارسال می شود، می تواند زمان ساخت و پیچیدگی غیر ضروری را به خصوص در پروژه های بزرگ افزایش دهد.
استفاده از dockerignore
یک فایل .dockerignore در ریشه پروژه خود، جایی که Dockerfile شما قرار دارد، ایجاد کنید. در این فایل، الگوهایی را برای فایلها و دایرکتوریها مشخص کنید تا از زمینه ساخت Docker حذف شوند.
نمونه ای از فایل .dockerignore
.git
.gitignore
Dockerfile*
*.md
node_modules
temp/
چه وقتی از dockerignore استفاده کنیم
مخازن بزرگ: برای پروژه هایی با حجم زیاد داده، به خصوص آنهایی که برای ساخت یا زمان اجرا مورد نیاز نیستند
اطلاعات حساس: برای حذف فایلهای حاوی سکرتها(env.) یا اطلاعات حساسی که نباید در زمینه ساخت Docker گنجانده شوند
دایرکتوریهای وابستگی: برای زبانهایی که وابستگیها را در فهرستهای محلی دانلود میکنند (مانند venv در پایتون)، که اگر در حین ساخت، وابستگیها را نصب میکنید، در زمینه ساخت مورد نیاز نیستند
بهترین رویکرد
مرتباً مرور کنید: بهطور دورهای فایل .dockerignore خود را بررسی کنید تا مطمئن شوید که با ساختار و الزامات پروژه شما بهروز است
الگوهای واضح: از الگوهای صریح استفاده کنید تا فایل ها و دایرکتوری های مورد نظر را دقیقاً مطابقت دهند و از حذف ناخواسته اجتناب کنید
حفظ امنیت: از .dockerignore برای تقویت امنیت با اطمینان از اینکه فقط فایل های لازم در زمینه ساخت شما گنجانده شده است، استفاده کنید
دامهای رایج
نادیده گرفتن .dockerignore: عدم استفاده یا پیکربندی صحیح فایل .dockerignore می تواند منجر به ساخت کند، اندازه تصویر بزرگتر و گنجاندن احتمالی اطلاعات حساس شود
حذف بیش از حد: در حالی که حذف فایلهای غیر ضروری مهم است، مراقب باشید فایلهایی را که برای فرآیند ساخت ضروری هستند حذف نکنید، که میتواند منجر به شکست ساخت یا رفتار نادرست تصویر شود.
لینک وبسایت
#docker
@code_crafters
Duck Typing in Python
از انجایی که پایتون داینامیک تایپ هست پس مفهوم داک تاپینیگ هم براش معنا پیدا میکنه. سیستم داک تایپینگ بر اساس اینترفیس و رفتار های ابجکت ها هست. خیلی از کلاس ها و ابزار های از موجود در پایتون از این سیستم پشتیبانی میکنند و این باعث انعطاف زیاد در کد میشه که در ادامه توضیح میدیم.
تعاریف زیادی در خصوص داک تایپینگ وجود داره، اما تعریف اصلی بر اساس این جمله معروف هست : "اگر مثل داک ( به فارسی : اردک) راه میره و مثل داک، کواک ( صدای اردک 😀) میکنه پس قطعا یک اردک است."
اگر بخواهیم این رو به برنامه نویسی تعمیم دهیم، شما میتونید چند ابجکت داشته باشید که صدای اردک در بیارن و مثل اردک راه برن و نیازی به چک کردن تایپشون که ایا اردک هستند، نباشه. داک تایپینگ یک تایپ سیستم هست که در اون، یک ابجکت میتونه سازگار با یک تایپ معین در نظر گرفته بشه اگر تمام متد ها و اتریبیوت های مورد نیاز اون تایپ رو داشته باشه. این تایپ سیستم در واقع از استفاده کردن چند ابجکت که هر کدوم از کلاس متفاوت و مستقلی هستند، در یک مفهوم خاص پشتیبانی میکنه. این امر تا زمانی ممکن هست که این کلاس ها به یک اینترفیس مشترک پایبند باشند. اگر کامل متوجه نشدید نگران نباشید با مثالی که میزنیم کاملا متوجه موضوع میشید :).
در قطعه کد زیر چند پرنده داریم که توانایی پرواز و شنا کردن رو دارند.
در این مثال سه پرنده ما میتونند هم پروار و هم شنا کنند اگرچه که هر کدوم یک کلاس جدا و مستقل از هم دیگه هستند. به دلیل اینکه هر سه کلاس ما اینترفیس مشترکی رو اراعه میدهند میتوانیم بدین صورت در کد از انها استفاده کنیم.
پایتون اهمیتی نمیده که وریبل پرنده )bird( دقیقا چه ابجکتی رو درون خودش داره و فقط متدی که بهش گفته شده رو اجرا میکنه.
اگر ابجکت ما متد مورد نظر رو داشته باشه، کد بدون مشکل اجرا میشه و این همون بحث انطعاف پذیری داک تایپینگ هست.
این بحث داک تایپینگ تو ابزار های built-in پایتون هم پیاده سازی و پشتیبانی میشه
که تو عکس1 در بخش کامنت ها میتونید ببینید.
نقاط قوت و ضعف داک تایپینگ
داک تایپینگ انعطاف پذیری زیادی رو به شما به عنوان برنامه نویس پیشنهاد میده و دلیل اصلیشم این هست نیازی به فکر کردن راجع به مفاهیم پیچیده ای مثل ارث بری و روابط بین کلاس ها، نیست.
نکات مثبت ان:
• انعطاف پذیری : میتوانید از ابجکت های مختلف بر اساس رفتار های انها بدون نگرانی درمورد تایپ انها به جای یکدیگر استفاده کنید. این ماژولار بودن و توسعه پذیری کد شما را بالا میبرد.
• سادگی : شما میتونید با تمرکز بر روی رفتار های مورد نیاز بجای تمرکز روی تایپ های خاص و کلاس ها و روابط بین انها، کدتون رو ساده کنید. این به شما اجازه میده که کد مختصر تر و رسا تری داشته باشید.
• استفاده مجدد از کد : شما میتونید از یک یا چند کلاس در یک اپ دیگر به طور مجدد استفاده کنید بدون انکه مجبور باشید سلسله مراتبی از کلاس هارو اکسپورت کنید تا کلاس مورد نظرتون کار بکنه.
خب همونطور که میدونید هیچ چیزی بی عیب و نقص نیست و داک تایپینگ هم از این قاعده مستثنی نیست.
نکات منفی ان :
• رانتایم ارور های احتمالی : شما ممکنه به یک سری ارور مرتبط با وجود نداشتن یک متد یا اتریبیوت مواجه بشید که فقط در صورت ران کردن کد متوجه این خطا خواهید شد و این منجر به رفتار غیر منتظره یا کرش کردن برنامه شما میشه.
• مشکلات نگهداری : ممکن است در دنبال کردن ابجکت هایی که باید رفتار خاضی از خود نشان بدهند دچار مشکل شوید. تغییرات در رفتار بعضی ابجکت های خاص ممکن است روی قسمت دیگری از کد تاثیر بگذارد و نگهداری کد و دیباگ کردن ان دچار مشکل شود.
#duck_typing
#type_system
#reall_python
@code_crafters
از انجایی که پایتون داینامیک تایپ هست پس مفهوم داک تاپینیگ هم براش معنا پیدا میکنه. سیستم داک تایپینگ بر اساس اینترفیس و رفتار های ابجکت ها هست. خیلی از کلاس ها و ابزار های از موجود در پایتون از این سیستم پشتیبانی میکنند و این باعث انعطاف زیاد در کد میشه که در ادامه توضیح میدیم.
تعاریف زیادی در خصوص داک تایپینگ وجود داره، اما تعریف اصلی بر اساس این جمله معروف هست : "اگر مثل داک ( به فارسی : اردک) راه میره و مثل داک، کواک ( صدای اردک 😀) میکنه پس قطعا یک اردک است."
اگر بخواهیم این رو به برنامه نویسی تعمیم دهیم، شما میتونید چند ابجکت داشته باشید که صدای اردک در بیارن و مثل اردک راه برن و نیازی به چک کردن تایپشون که ایا اردک هستند، نباشه. داک تایپینگ یک تایپ سیستم هست که در اون، یک ابجکت میتونه سازگار با یک تایپ معین در نظر گرفته بشه اگر تمام متد ها و اتریبیوت های مورد نیاز اون تایپ رو داشته باشه. این تایپ سیستم در واقع از استفاده کردن چند ابجکت که هر کدوم از کلاس متفاوت و مستقلی هستند، در یک مفهوم خاص پشتیبانی میکنه. این امر تا زمانی ممکن هست که این کلاس ها به یک اینترفیس مشترک پایبند باشند. اگر کامل متوجه نشدید نگران نباشید با مثالی که میزنیم کاملا متوجه موضوع میشید :).
در قطعه کد زیر چند پرنده داریم که توانایی پرواز و شنا کردن رو دارند.
--------------
birds_v1.py
--------------
class Duck:
def swim(self):
print("The duck is swimming")
def fly(self):
print("The duck is flying")
class Swan:
def swim(self):
print("The swan is swimming")
def fly(self):
print("The swan is flying")
class Albatross:
def swim(self):
print("The albatross is swimming")
def fly(self):
print("The albatross is flying")
در این مثال سه پرنده ما میتونند هم پروار و هم شنا کنند اگرچه که هر کدوم یک کلاس جدا و مستقل از هم دیگه هستند. به دلیل اینکه هر سه کلاس ما اینترفیس مشترکی رو اراعه میدهند میتوانیم بدین صورت در کد از انها استفاده کنیم.
>>> from birds_v1 import Duck, Swan, Albatross
>>> birds = [Duck(), Swan(), Albatross()]
>>> for bird in birds:
... bird.fly()
... bird.swim()
...
The duck is flying
The duck is swimming
The swan is flying
The swan is swimming
The albatross is flying
The albatross is swimming
پایتون اهمیتی نمیده که وریبل پرنده )bird( دقیقا چه ابجکتی رو درون خودش داره و فقط متدی که بهش گفته شده رو اجرا میکنه.
اگر ابجکت ما متد مورد نظر رو داشته باشه، کد بدون مشکل اجرا میشه و این همون بحث انطعاف پذیری داک تایپینگ هست.
این بحث داک تایپینگ تو ابزار های built-in پایتون هم پیاده سازی و پشتیبانی میشه
که تو عکس1 در بخش کامنت ها میتونید ببینید.
نقاط قوت و ضعف داک تایپینگ
داک تایپینگ انعطاف پذیری زیادی رو به شما به عنوان برنامه نویس پیشنهاد میده و دلیل اصلیشم این هست نیازی به فکر کردن راجع به مفاهیم پیچیده ای مثل ارث بری و روابط بین کلاس ها، نیست.
نکات مثبت ان:
• انعطاف پذیری : میتوانید از ابجکت های مختلف بر اساس رفتار های انها بدون نگرانی درمورد تایپ انها به جای یکدیگر استفاده کنید. این ماژولار بودن و توسعه پذیری کد شما را بالا میبرد.
• سادگی : شما میتونید با تمرکز بر روی رفتار های مورد نیاز بجای تمرکز روی تایپ های خاص و کلاس ها و روابط بین انها، کدتون رو ساده کنید. این به شما اجازه میده که کد مختصر تر و رسا تری داشته باشید.
• استفاده مجدد از کد : شما میتونید از یک یا چند کلاس در یک اپ دیگر به طور مجدد استفاده کنید بدون انکه مجبور باشید سلسله مراتبی از کلاس هارو اکسپورت کنید تا کلاس مورد نظرتون کار بکنه.
خب همونطور که میدونید هیچ چیزی بی عیب و نقص نیست و داک تایپینگ هم از این قاعده مستثنی نیست.
نکات منفی ان :
• رانتایم ارور های احتمالی : شما ممکنه به یک سری ارور مرتبط با وجود نداشتن یک متد یا اتریبیوت مواجه بشید که فقط در صورت ران کردن کد متوجه این خطا خواهید شد و این منجر به رفتار غیر منتظره یا کرش کردن برنامه شما میشه.
• مشکلات نگهداری : ممکن است در دنبال کردن ابجکت هایی که باید رفتار خاضی از خود نشان بدهند دچار مشکل شوید. تغییرات در رفتار بعضی ابجکت های خاص ممکن است روی قسمت دیگری از کد تاثیر بگذارد و نگهداری کد و دیباگ کردن ان دچار مشکل شود.
#duck_typing
#type_system
#reall_python
@code_crafters
👍5❤1👌1
حالا اگر بخواید تو کلاس کاستوم خودتون داک تایپینگ رو پیاده سازی کنید دو روش وجود داره
1. Regular methods
که دقیقا همون مثال پرنده ای که زدیم در بالا از همین روش استفاده شده ولی اگر بخوایم یک مثال کاربردی تر بزنیم میتونیم فرض کنیم میخوایم چند کلاس بسازیم واسه خواندن انواع فایل های csv, json, txt خب میایم سه تا کلاس میسازیم و واسه هر کدوم یک متد با نام مشابه برای خواندن فایل و یک اتریبیوت با نام مشابه نیز میسازیم، اینطوری یک اینترفیس یکسان و مشترک برای کلاس های مختلف با ساز و کار مختلف داریم. به راحتی میتونیم چند ابجکت مختلف از این کلاس ها بسازیم و با یک حلقه فور میتونیم از متد خواندن استفاده کنیم.
2. Special methods
اسپشیال متد ها یا همون داندر متد ها، با دوتا اندراسکور در اول و اخر نامشون مشخص میشوند و معنای خاصی برای پایتون دارند.
بیاید فرض کنیم میخوایم یک صف )queue( درست کنیم
و میخوایم که صف ما iterable باشه و همچنین بتونیم از
Len, reversed , in استفاده کنیم
خب کد ما به به این شکل خواهد شد :
خب تو این کلاس ما دوتا عملیات کلاسیک اضافه کردن به صف و حذف کردن از صف رو داریم و همچنین چند داندر متد برای کلاس پیاده سازی کردیم تا عملیات های مورد نیاز مارو پشتیبانی کنه.
منبع
#duck_typing
#type_system
#reall_python
@code_crafters
1. Regular methods
که دقیقا همون مثال پرنده ای که زدیم در بالا از همین روش استفاده شده ولی اگر بخوایم یک مثال کاربردی تر بزنیم میتونیم فرض کنیم میخوایم چند کلاس بسازیم واسه خواندن انواع فایل های csv, json, txt خب میایم سه تا کلاس میسازیم و واسه هر کدوم یک متد با نام مشابه برای خواندن فایل و یک اتریبیوت با نام مشابه نیز میسازیم، اینطوری یک اینترفیس یکسان و مشترک برای کلاس های مختلف با ساز و کار مختلف داریم. به راحتی میتونیم چند ابجکت مختلف از این کلاس ها بسازیم و با یک حلقه فور میتونیم از متد خواندن استفاده کنیم.
2. Special methods
اسپشیال متد ها یا همون داندر متد ها، با دوتا اندراسکور در اول و اخر نامشون مشخص میشوند و معنای خاصی برای پایتون دارند.
بیاید فرض کنیم میخوایم یک صف )queue( درست کنیم
و میخوایم که صف ما iterable باشه و همچنین بتونیم از
Len, reversed , in استفاده کنیم
خب کد ما به به این شکل خواهد شد :
from collections import deque
class Queue:
def __init__(self):
self._elements = deque()
def enqueue(self, element):
self._elements.append(element)
def dequeue(self):
return self._elements.popleft()
def __iter__(self):
return iter(self._elements)
def __len__(self):
return len(self._elements)
def __reversed__(self):
return reversed(self._elements)
def __contains__(self, element):
return element in self._elements
خب تو این کلاس ما دوتا عملیات کلاسیک اضافه کردن به صف و حذف کردن از صف رو داریم و همچنین چند داندر متد برای کلاس پیاده سازی کردیم تا عملیات های مورد نیاز مارو پشتیبانی کنه.
>>> from queues import Queueمیبینید که تمام عملیات های مورد نیاز مارو به خوبی انجام میده.
>>> queue = Queue()
>>> queue.enqueue(1)
>>> queue.enqueue(2)
>>> queue.enqueue(3)
>>> [item for item in queue]
[1, 2, 3]
>>> len(queue)
3
>>> list(reversed(queue))
[3, 2, 1]
>>> 2 in queue
True
>>> 6 in queue
False
منبع
#duck_typing
#type_system
#reall_python
@code_crafters
👍4💋2❤1
دوستان عزیز داریم یه گروه جمع میکنیم که صفحات و مطالب سایت reall python رو ترجمه کنیم به زبان فارسی
اگه کسانی تمایل به همکاری دارن بهم پیام بدن که بتونیم تو این عید صفحات بیشتر و کل سایت رو ترجمه کنیم کنار هم در نهایت بعد از اتمام سایت رو بالا میاریم و اسامی افراد شرکت کننده در ترجمه صفحات هم داخلش میزاریم
یک اینکه این موضوع منجر میشه که با پایتون بیشتر آشنا بشید
ماژولها و موارد بیشتری از پایتون رو بشناسید
و اینکه بعنوان یک کار در جامعه فارسی زبان ازتون باقی خواهد مونده
اگه کسانی تمایل به همکاری دارن بهم پیام بدن که بتونیم تو این عید صفحات بیشتر و کل سایت رو ترجمه کنیم کنار هم در نهایت بعد از اتمام سایت رو بالا میاریم و اسامی افراد شرکت کننده در ترجمه صفحات هم داخلش میزاریم
یک اینکه این موضوع منجر میشه که با پایتون بیشتر آشنا بشید
ماژولها و موارد بیشتری از پایتون رو بشناسید
و اینکه بعنوان یک کار در جامعه فارسی زبان ازتون باقی خواهد مونده
👍9
5-بررسی سلامت داکرفایل
اجرای چک های سلامت مستقیماً در داکرفایل روشی قدرتمند برای نظارت خودکار بر وضعیت عملیاتی کانتینرهای شما است. با تعریف بررسی های بهداشتی، داکر می تواند تصمیمات آگاهانه ای در مورد سلامت کانتینرها بگیرد و اقدامات مناسب را انجام دهد، مانند راه اندازی مجدد کانتینر معیوب یا جلوگیری از هدایت ترافیک به آن تا زمانی که سالم شود
بررسی سلامت داکرفایل چیست
بررسی سلامت داکر دستوری است که در داکرفایل مشخص شده است که داکر به صورت دوره ای برای بررسی سلامت یک کانتینر اجرا می کند. این دستور باید نشان دهد که آیا کانتینر به درستی کار می کند یا خیر، داکر وضعیت خروج از فرمان بررسی سلامت را برای تعیین وضعیت سلامت کانتینر تفسیر می کند: وضعیت خروج 0 به معنای سالم و غیر صفر به معنای ناسالم است
چگونه از بررسی سلامت داکرفایل استفاده کنیم
بررسی های سلامت در داکرفایل با استفاده از دستورالعمل HEALTHCHECK تعریف شده است. میتوانید دستور اجرا، فاصله بین بررسیها، زمان پایان هر چک، تعداد دفعات تکرار قبل از در نظر گرفتن سرویس ناسالم، و دوره شروع برای تثبیت کانتینر قبل از شروع بررسیهای سلامت را مشخص کنید
نمونه داکرفایل با بررسی سلامت
این مثال یک بررسی سلامتی را روی ظرف Nginx تنظیم میکند و از curl برای درخواست صفحه اصلی هر 30 ثانیه استفاده میکند. اگر دستور سه بار پشت سر هم ناموفق باشد (صفحه به درستی برگردانده نشده است)، داکر ظرف را به عنوان ناسالم علامت گذاری می کند
Dockerfile
در دسترس بودن سرویس: زمانی که باید اطمینان حاصل کنید که یک سرویس در یک کانتینر در دسترس است و قبل از ارسال ترافیک به آن پاسخگو است
آمادگی وابستگی: در کاربردهای چند کانتینری، که در آن کانتینرهای خاصی به عملکرد کامل سایر کانتینرها بستگی دارند
سیستم های خود درمانی: برای ایجاد یک سیستم انعطاف پذیرتر که می تواند به طور خودکار ظروف ناسالم را راه اندازی مجدد کند
بهترین رویکرد
به حداقل رساندن تأثیر عملکرد: اطمینان حاصل کنید که دستور بررسی سلامت سبک است و تأثیر قابل توجهی بر عملکرد ظرف ندارد
دورههای شروع دقیق: یک دوره شروع واقعی را تنظیم کنید تا قبل از شروع شکست در بررسیهای سلامت، زمان کافی برای شروع اولیه به برنامه خود بدهید
از نقاط پایانی سلامت خاص استفاده کنید: ترجیح میدهید از نقاط پایانی خاص (به عنوان مثال، /healthz) استفاده کنید که سلامت اجزای مختلف برنامه را بررسی میکند، نه فقط صفحه اصلی یا یک بررسی اولیه TCP
دامهای رایج
دستورات پیچیده: از دستورات بیش از حد پیچیده بررسی سلامت که ممکن است غیرقابل اعتماد باشند یا عوارض جانبی غیرمنتظره ایجاد کنند، خودداری کنید
نادیده گرفتن وابستگی های خارجی: اگر سلامت کانتینر شما به خدمات خارجی بستگی دارد، مطمئن شوید که بررسی سلامت شما در دسترس بودن آنها را در نظر می گیرد و از مثبت کاذب جلوگیری می کند
یک نمونه برای داکرفایل جنگو
یک نمونه در داکرکامپوز
لینک وبسایت
#docker
@code_crafters
اجرای چک های سلامت مستقیماً در داکرفایل روشی قدرتمند برای نظارت خودکار بر وضعیت عملیاتی کانتینرهای شما است. با تعریف بررسی های بهداشتی، داکر می تواند تصمیمات آگاهانه ای در مورد سلامت کانتینرها بگیرد و اقدامات مناسب را انجام دهد، مانند راه اندازی مجدد کانتینر معیوب یا جلوگیری از هدایت ترافیک به آن تا زمانی که سالم شود
بررسی سلامت داکرفایل چیست
بررسی سلامت داکر دستوری است که در داکرفایل مشخص شده است که داکر به صورت دوره ای برای بررسی سلامت یک کانتینر اجرا می کند. این دستور باید نشان دهد که آیا کانتینر به درستی کار می کند یا خیر، داکر وضعیت خروج از فرمان بررسی سلامت را برای تعیین وضعیت سلامت کانتینر تفسیر می کند: وضعیت خروج 0 به معنای سالم و غیر صفر به معنای ناسالم است
چگونه از بررسی سلامت داکرفایل استفاده کنیم
بررسی های سلامت در داکرفایل با استفاده از دستورالعمل HEALTHCHECK تعریف شده است. میتوانید دستور اجرا، فاصله بین بررسیها، زمان پایان هر چک، تعداد دفعات تکرار قبل از در نظر گرفتن سرویس ناسالم، و دوره شروع برای تثبیت کانتینر قبل از شروع بررسیهای سلامت را مشخص کنید
نمونه داکرفایل با بررسی سلامت
این مثال یک بررسی سلامتی را روی ظرف Nginx تنظیم میکند و از curl برای درخواست صفحه اصلی هر 30 ثانیه استفاده میکند. اگر دستور سه بار پشت سر هم ناموفق باشد (صفحه به درستی برگردانده نشده است)، داکر ظرف را به عنوان ناسالم علامت گذاری می کند
Dockerfile
FROM nginx:latesthealth-check.sh
COPY nginx.conf /etc/nginx/nginx.conf
# Health check script
COPY health-check.sh /usr/share/nginx/html/health-check.sh
# Make the script executable
RUN chmod +x /usr/share/nginx/html/health-check.sh
EXPOSE 80
# Health check definition
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD /usr/share/nginx/html/health-check.sh
#!/bin/bashچه وقتی از بررسی سلامت کانتینر استفاده کنیم
if curl -sSf https://localhost:80 > /dev/null; then
exit 0
else
exit 1
fi
در دسترس بودن سرویس: زمانی که باید اطمینان حاصل کنید که یک سرویس در یک کانتینر در دسترس است و قبل از ارسال ترافیک به آن پاسخگو است
آمادگی وابستگی: در کاربردهای چند کانتینری، که در آن کانتینرهای خاصی به عملکرد کامل سایر کانتینرها بستگی دارند
سیستم های خود درمانی: برای ایجاد یک سیستم انعطاف پذیرتر که می تواند به طور خودکار ظروف ناسالم را راه اندازی مجدد کند
بهترین رویکرد
به حداقل رساندن تأثیر عملکرد: اطمینان حاصل کنید که دستور بررسی سلامت سبک است و تأثیر قابل توجهی بر عملکرد ظرف ندارد
دورههای شروع دقیق: یک دوره شروع واقعی را تنظیم کنید تا قبل از شروع شکست در بررسیهای سلامت، زمان کافی برای شروع اولیه به برنامه خود بدهید
از نقاط پایانی سلامت خاص استفاده کنید: ترجیح میدهید از نقاط پایانی خاص (به عنوان مثال، /healthz) استفاده کنید که سلامت اجزای مختلف برنامه را بررسی میکند، نه فقط صفحه اصلی یا یک بررسی اولیه TCP
دامهای رایج
دستورات پیچیده: از دستورات بیش از حد پیچیده بررسی سلامت که ممکن است غیرقابل اعتماد باشند یا عوارض جانبی غیرمنتظره ایجاد کنند، خودداری کنید
نادیده گرفتن وابستگی های خارجی: اگر سلامت کانتینر شما به خدمات خارجی بستگی دارد، مطمئن شوید که بررسی سلامت شما در دسترس بودن آنها را در نظر می گیرد و از مثبت کاذب جلوگیری می کند
یک نمونه برای داکرفایل جنگو
#----
# Use an official Python runtime as a parent image
FROM python:3.8
# Set environment variables
ENV PYTHONUNBUFFERED 1
# Set working directory
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed dependencies specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# Expose port 8000 to the outside world
EXPOSE 8000
# Define the health check command
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl --silent --fail localhost:8000/health-check || exit 1
# Run the Django application
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
#---
یک نمونه در داکرکامپوز
#---
version: '3'
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
restart: on-failure
healthcheck:
test: ["CMD-SHELL", "curl --silent --fail localhost:8000/health-check || exit 1"]
interval: 5s
timeout: 3s
retries: 3
#---
لینک وبسایت
#docker
@code_crafters
6-قالب بندی خروجی داکر CLI
رابط خط فرمان داکر (CLI) یک ویژگی قدرتمند برای سفارشی کردن خروجی دستورات با استفاده از گزینه formating-- فراهم می کند.این گزینه از زبان الگوی Go استفاده می کند تا به کاربران اجازه دهد دقیقاً نحوه ساختار خروجی را مشخص کنند و تجزیه یا ادغام با ابزارهای دیگر را آسان تر می کند
قالب بندی خروجی داکر CLI چیست
قالببندی خروجی داکر CLI به شما امکان میدهد تا خروجی دستورات Docker را مطابق با نیازهای خود تنظیم کنید، با استفاده از زبان قالب Go برای تعیین فرمت خروجی. این ویژگی برای استخراج قطعات خاصی از اطلاعات از خروجیهای فرمان پرمخاطب داکر، بهویژه هنگام خودکارسازی وظایف یا ادغام با خطوط لوله CI/CD بسیار ارزشمند است
چگونه از قالب بندی خروجی داکر CLI استفاده کنیم
فاگ format-- را می توان با دستورات مختلف داکر CLI برای سفارشی کردن خروجی آنها استفاده کرد.در اینجا مثالی از نحوه فهرست کردن همه شناسههای کانتینر با استفاده از قالب سفارشی آورده شده است:
این دستور شناسههای همه کانتینرهای در حال اجرا را، یکی در هر خط، بدون هیچ گونه اطلاعات یا هدر اضافی فهرست میکند
مثال پیشرفته: فهرست کردن تصاویر با ویژگی های خاص
در اینجا نحوه فهرست کردن تصاویر، نشان دادن تنها مخزن، برچسب و اندازه آنها در قالب جدول آمده است:
این دستور یک جدول با فرمت منظم از تصاویر Docker شما ایجاد می کند که فقط نام مخزن، برچسب و اندازه تصویر را نشان می دهد
چه وقتی از قالب بندی خروجی داکر CLI استفاده کنیم
اسکریپت و اتوماسیون: زمانی که نیاز به تجزیه خروجی های دستور Docker در اسکریپت ها یا ابزارهای اتوماسیون دارید
گزارش سفارشی: ایجاد گزارش یا داشبورد سفارشی که به اطلاعات خاصی از محیط Docker شما نیاز دارد
خروجی ساد: زمانی که می خواهید خروجی را برای وضوح ساده یا تمرکز بر جزئیات خاص ساده کنید
بهترین رویکرد
الگوسازی Go را درک کنید: برای استفاده مؤثر از گزینههای قالببندی، با نحو قالببندی Go آشنا شوید
از قالب بندی جدول برای خوانایی استفاده کنید: از قالب بندی جدول برای خروجی های قابل خواندن توسط انسان استفاده کنید، به خصوص هنگام به اشتراک گذاری اطلاعات با اعضای تیم
ترکیب با سایر ابزارهای یونیکس: برای پردازش قدرتمندتر، خروجی داکر فرمت شده را با ابزارهای یونیکس مانند grep، awk یا jq برای خروجی های JSON ترکیب کنید
دامهای رایج
پیچیدگی بیش از حد: از ایجاد الگوهای بیش از حد پیچیده که خواندن و نگهداری آنها سخت است خودداری کنید. آن را تا حد امکان برای کار در دست ساده نگه دارید
قالب بندی ناسازگار: هنگام استفاده از فرمت های سفارشی در میان اسکریپت ها یا ابزارهای مختلف، برای جلوگیری از سردرگمی، سازگاری را حفظ کنید
لینک وبسایت
#docker
@code_crafters
رابط خط فرمان داکر (CLI) یک ویژگی قدرتمند برای سفارشی کردن خروجی دستورات با استفاده از گزینه formating-- فراهم می کند.این گزینه از زبان الگوی Go استفاده می کند تا به کاربران اجازه دهد دقیقاً نحوه ساختار خروجی را مشخص کنند و تجزیه یا ادغام با ابزارهای دیگر را آسان تر می کند
قالب بندی خروجی داکر CLI چیست
قالببندی خروجی داکر CLI به شما امکان میدهد تا خروجی دستورات Docker را مطابق با نیازهای خود تنظیم کنید، با استفاده از زبان قالب Go برای تعیین فرمت خروجی. این ویژگی برای استخراج قطعات خاصی از اطلاعات از خروجیهای فرمان پرمخاطب داکر، بهویژه هنگام خودکارسازی وظایف یا ادغام با خطوط لوله CI/CD بسیار ارزشمند است
چگونه از قالب بندی خروجی داکر CLI استفاده کنیم
فاگ format-- را می توان با دستورات مختلف داکر CLI برای سفارشی کردن خروجی آنها استفاده کرد.در اینجا مثالی از نحوه فهرست کردن همه شناسههای کانتینر با استفاده از قالب سفارشی آورده شده است:
docker ps --format '{{.ID}}'
این دستور شناسههای همه کانتینرهای در حال اجرا را، یکی در هر خط، بدون هیچ گونه اطلاعات یا هدر اضافی فهرست میکند
مثال پیشرفته: فهرست کردن تصاویر با ویژگی های خاص
در اینجا نحوه فهرست کردن تصاویر، نشان دادن تنها مخزن، برچسب و اندازه آنها در قالب جدول آمده است:
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
این دستور یک جدول با فرمت منظم از تصاویر Docker شما ایجاد می کند که فقط نام مخزن، برچسب و اندازه تصویر را نشان می دهد
چه وقتی از قالب بندی خروجی داکر CLI استفاده کنیم
اسکریپت و اتوماسیون: زمانی که نیاز به تجزیه خروجی های دستور Docker در اسکریپت ها یا ابزارهای اتوماسیون دارید
گزارش سفارشی: ایجاد گزارش یا داشبورد سفارشی که به اطلاعات خاصی از محیط Docker شما نیاز دارد
خروجی ساد: زمانی که می خواهید خروجی را برای وضوح ساده یا تمرکز بر جزئیات خاص ساده کنید
بهترین رویکرد
الگوسازی Go را درک کنید: برای استفاده مؤثر از گزینههای قالببندی، با نحو قالببندی Go آشنا شوید
از قالب بندی جدول برای خوانایی استفاده کنید: از قالب بندی جدول برای خروجی های قابل خواندن توسط انسان استفاده کنید، به خصوص هنگام به اشتراک گذاری اطلاعات با اعضای تیم
ترکیب با سایر ابزارهای یونیکس: برای پردازش قدرتمندتر، خروجی داکر فرمت شده را با ابزارهای یونیکس مانند grep، awk یا jq برای خروجی های JSON ترکیب کنید
دامهای رایج
پیچیدگی بیش از حد: از ایجاد الگوهای بیش از حد پیچیده که خواندن و نگهداری آنها سخت است خودداری کنید. آن را تا حد امکان برای کار در دست ساده نگه دارید
قالب بندی ناسازگار: هنگام استفاده از فرمت های سفارشی در میان اسکریپت ها یا ابزارهای مختلف، برای جلوگیری از سردرگمی، سازگاری را حفظ کنید
لینک وبسایت
#docker
@code_crafters
Property and Descriptor-Based Attributes
Property
پایتون به شما امکان میدهد رفتاری شبیه به تابع را بر روی اتریبیوت های موجود در کلاس اضافه کنید و آنها را به اتریبیوت های مدیریتشده (managed attribute) تبدیل کنید. این نوع ویژگی از بروز تغییرات اساسی در APIیعنی همان اینترفیس عمومی های شما جلوگیری میکند.
به عبارت دیگر، با اتریبیوت های مدیریت شده، شما میتوانید همزمان از رفتار شبیه به تابع و دسترسی شبیه به اتریبیوت بهرهمند شوید. نیازی به تغییر APIهای خود با جایگزین کردن اتریبیوت ها با متدها نیست، که ممکن است کد کاربرانتان را دچار مشکل کند.
برای ایجاد یک اتریبیوت مدیریت شده با رفتار شبیه به تابع در پایتون، شما میتوانید از یک property یا یک descriptor استفاده کنید، بسته به نیازهای خاص خود.
به عنوان مثال، به کلاس Circle خود برگردید و فرض کنید که نیاز دارید شعاع را تایید کنید تا اطمینان حاصل شود که فقط اعداد مثبت ذخیره میشوند. چگونه این کار را بدون تغییر اینترفیس کلاس انجام میدهید؟ سریعترین روش برای حل این مشکل استفاده از یک property و پیادهسازی منطق ولیدیشن( اعتبارسنجی) در متد setter است.
برای تبدیل اتریبیوت radius به یک پراپرتی، از دکوریتور property استفاده میکنیم یک متد getter بنویسیم. این متد هنگامی اجرا میشه که میخواهیم مقدار اتریبیوت radius رو مشاهده کنیم، پس قطعا باید مقدار شعاع رو به ما ریترن(return) کنه.
برای اینکه یک متد setter برای پراپرتی شعاع مون بنویسم از دکوریتور @ attr_name.setter استفاده میکنیم.
حال داخل متد setter میایم و منطق اعتبارسنجی که نیاز داشتیم رو پیاده میکنیم و اگر عدد طبق چیزی که انتظار داشتیم نبود به ما خطا میدهد در غیر این صورت در یک اتریبیوت non-public به نام _radius ذخیره میکنیم. حالا اتریبیوت radius ما تبدیل به یک پراپرتی شده و هرموقع که نیاز به مشاهده مقدار یا تغییر مقدار ان بودیم خود پایتون اتومات، ابتدا با توجه به عملیات یکی از متد های getter یا setter رو کال میکنه.
نحوه کارکرد اون به شکل زیر هست.
میبینید که با اتریبیوت radius دارید به طور عادی رفتار میکنید اما در پشت قضیه، یک رفتار متد مانند دارد و اگر مقدار نامعتبر دهید خطا میدهد.
منبع
#Property #Python
@Code_Crafters
Property
پایتون به شما امکان میدهد رفتاری شبیه به تابع را بر روی اتریبیوت های موجود در کلاس اضافه کنید و آنها را به اتریبیوت های مدیریتشده (managed attribute) تبدیل کنید. این نوع ویژگی از بروز تغییرات اساسی در APIیعنی همان اینترفیس عمومی های شما جلوگیری میکند.
به عبارت دیگر، با اتریبیوت های مدیریت شده، شما میتوانید همزمان از رفتار شبیه به تابع و دسترسی شبیه به اتریبیوت بهرهمند شوید. نیازی به تغییر APIهای خود با جایگزین کردن اتریبیوت ها با متدها نیست، که ممکن است کد کاربرانتان را دچار مشکل کند.
برای ایجاد یک اتریبیوت مدیریت شده با رفتار شبیه به تابع در پایتون، شما میتوانید از یک property یا یک descriptor استفاده کنید، بسته به نیازهای خاص خود.
به عنوان مثال، به کلاس Circle خود برگردید و فرض کنید که نیاز دارید شعاع را تایید کنید تا اطمینان حاصل شود که فقط اعداد مثبت ذخیره میشوند. چگونه این کار را بدون تغییر اینترفیس کلاس انجام میدهید؟ سریعترین روش برای حل این مشکل استفاده از یک property و پیادهسازی منطق ولیدیشن( اعتبارسنجی) در متد setter است.
import math
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if not isinstance(value, int | float) or value <= 0:
raise ValueError("positive number expected")
self._radius = value
def calculate_area(self):
return round(math.pi * self._radius**2, 2)
برای تبدیل اتریبیوت radius به یک پراپرتی، از دکوریتور property استفاده میکنیم یک متد getter بنویسیم. این متد هنگامی اجرا میشه که میخواهیم مقدار اتریبیوت radius رو مشاهده کنیم، پس قطعا باید مقدار شعاع رو به ما ریترن(return) کنه.
برای اینکه یک متد setter برای پراپرتی شعاع مون بنویسم از دکوریتور @ attr_name.setter استفاده میکنیم.
حال داخل متد setter میایم و منطق اعتبارسنجی که نیاز داشتیم رو پیاده میکنیم و اگر عدد طبق چیزی که انتظار داشتیم نبود به ما خطا میدهد در غیر این صورت در یک اتریبیوت non-public به نام _radius ذخیره میکنیم. حالا اتریبیوت radius ما تبدیل به یک پراپرتی شده و هرموقع که نیاز به مشاهده مقدار یا تغییر مقدار ان بودیم خود پایتون اتومات، ابتدا با توجه به عملیات یکی از متد های getter یا setter رو کال میکنه.
نحوه کارکرد اون به شکل زیر هست.
>>> from circle import Circle
>>> circle_1 = Circle(100)
>>> circle_1.radius
100
>>> circle_1.radius = 500
>>> circle_1.radius = 0
Traceback (most recent call last):
...
ValueError: positive number expected
>>> circle_2 = Circle(-100)
Traceback (most recent call last):
...
ValueError: positive number expected
>>> circle_3 = Circle("300")
Traceback (most recent call last):
...
ValueError: positive number expected
میبینید که با اتریبیوت radius دارید به طور عادی رفتار میکنید اما در پشت قضیه، یک رفتار متد مانند دارد و اگر مقدار نامعتبر دهید خطا میدهد.
منبع
#Property #Python
@Code_Crafters
❤2🔥1👏1
Descriptor
استفاده از descriptor ها هم یک روش قوی برای اضافه کردن رفتار متد مانند به یک اتریبیوت بدون تغییر دادن اینترفیس یک کلاس است. فرض کنید یک برنامه طراحی نوشتید و دو تا کلاس به نام های دایره و مربع دارید. میخواهیم عددی را به عنوان شعاع/ طول بگیریم و قبل ان چک کنیم که عدد حتما مثبت باشد. خب طبق چیزی که تا الان یاد گرفتیم میدانیم که با property میشود همین کار را انجام داد اما این کار باعث کد تکراری زدن میشود و خوب نیست پس از descriptor استفاده میکنیم.
با استفاده از descriptor کدی مانند زیر خواهیم داشت.
در قطعه کد بالا میبینیم که یک کلاس به نام PositiveNumber داریم.
این همان descriptor ما هست. سه داندر متد داره که به ترتیب به توضیح انها میپردازم.
متد اولی توسط پایتون به صورت اتومات هنگامی که از ان یک اینستنس بسازید صدا زده میشود و نام ان اینستنس هرچه که باشد به عنوان ارگومان name به متد پاس داده میشود. ارگومان owner هم نام کلاسی است که descriptor در ان استفاده شده است. ( در مثال ما Circle یا Square)
متد دوم همان متد getter و متد سوم هم همان متد setter همانند کاری که در پراپرتی انجام دادیم.
ارگومان instance که در دو متد getter,setter وجود داره درواقع همون اینستنسی هست که از کلاس Circle یا Square ما ساخته شده.
توجه داشته باشید که برای ذخیره یا مشاهده از اتریبیوت
این متد ها، اتومات توسط خود پایتون صدا زده میشوند.
حال در کلاس دایره خود، یک اتریبیوت کلاس به نام radius داریم که مقدارش، یک اینستنس از کلاس descriptor ما هست.
حال از این بعد هروقت بخواهیم مقداری در اتریبیوت radius ذخیره کنیم یا مقدار ان را مشاهده کنیم، بجای انکه پایتون از اتریبیوت
منبع
#Descriptor #Python
@Code_Crafters
استفاده از descriptor ها هم یک روش قوی برای اضافه کردن رفتار متد مانند به یک اتریبیوت بدون تغییر دادن اینترفیس یک کلاس است. فرض کنید یک برنامه طراحی نوشتید و دو تا کلاس به نام های دایره و مربع دارید. میخواهیم عددی را به عنوان شعاع/ طول بگیریم و قبل ان چک کنیم که عدد حتما مثبت باشد. خب طبق چیزی که تا الان یاد گرفتیم میدانیم که با property میشود همین کار را انجام داد اما این کار باعث کد تکراری زدن میشود و خوب نیست پس از descriptor استفاده میکنیم.
با استفاده از descriptor کدی مانند زیر خواهیم داشت.
import math
class PositiveNumber:
def __set_name__(self, owner, name):
self._name = name
def __get__(self, instance, owner):
return instance.__dict__[self._name]
def __set__(self, instance, value):
if not isinstance(value, int | float) or value <= 0:
raise ValueError("positive number expected")
instance.__dict__[self._name] = value
class Circle:
radius = PositiveNumber()
def __init__(self, radius):
self.radius = radius
def calculate_area(self):
return round(math.pi * self.radius**2, 2)
class Square:
side = PositiveNumber()
def __init__(self, side):
self.side = side
def calculate_area(self):
return round(self.side**2, 2)
در قطعه کد بالا میبینیم که یک کلاس به نام PositiveNumber داریم.
این همان descriptor ما هست. سه داندر متد داره که به ترتیب به توضیح انها میپردازم.
متد اولی توسط پایتون به صورت اتومات هنگامی که از ان یک اینستنس بسازید صدا زده میشود و نام ان اینستنس هرچه که باشد به عنوان ارگومان name به متد پاس داده میشود. ارگومان owner هم نام کلاسی است که descriptor در ان استفاده شده است. ( در مثال ما Circle یا Square)
متد دوم همان متد getter و متد سوم هم همان متد setter همانند کاری که در پراپرتی انجام دادیم.
ارگومان instance که در دو متد getter,setter وجود داره درواقع همون اینستنسی هست که از کلاس Circle یا Square ما ساخته شده.
توجه داشته باشید که برای ذخیره یا مشاهده از اتریبیوت
__dict__استفاده میکنیم که جلوتر متوجه علت ان خواهید شد.
این متد ها، اتومات توسط خود پایتون صدا زده میشوند.
حال در کلاس دایره خود، یک اتریبیوت کلاس به نام radius داریم که مقدارش، یک اینستنس از کلاس descriptor ما هست.
حال از این بعد هروقت بخواهیم مقداری در اتریبیوت radius ذخیره کنیم یا مقدار ان را مشاهده کنیم، بجای انکه پایتون از اتریبیوت
__dict__ان را بخواند یا ذخیره کند، متد های getter, setter از کلاس PositiveNumber با توجه به عملیات مورد نیاز صدا زده میشود و ارگومان های مورد نیاز پاس داده خواهد شد.
منبع
#Descriptor #Python
@Code_Crafters
👍4❤2👏1
فصل چهارم کتاب
ساخت بلوکهای همزمانی
همزمانی شامل تجزیه برنامه به واحدهای مستقل است، در فصول قبل سخت افزار رو بررسی کردیم و در سیستمهای مدرن برای همزمانی با استفاده از انتزاعی که سیستم عامل بر روی سخت افزار انجام میدهد میتوانیم همزمانی رو پیش ببریم، در این فصل به این موضوع میپردازیم که توسعه دهندگان برنامه خود را چطور با کمک سیستم عامل در استفاده بهینه از سخت افزار ساختار میدهند
مراحل برنامه نویسی همزمان
برنامه نویسی همزمان مجموعهای از انتزاعها است که به توسعه دهندگان این اجازه رو میده تا برنامه خودشون رو به وظابفی کوچک و مستقل ساختار داده و از طریق سیستم زمان اجرا (system runtime) جهت اجرا در صف انتقال دهند، سیستم زمان اجرا منابع رو برای استفاده بهینه هماهنگ کرده و وظایف رو برای اجرا در منابع ارسال میکند، دو انتزاع برای اینکار در همزمانی وجود دارد فرآیندها و رشتهها
فرایندها(processes)
فرآیند خود یک برنامه است که روی دیسک مینشیند یک مجموعه دستورالعملها رو نشون میده که منتظر اجرا هستند، سیستم عامل این دستورالعمل هارو میگیره به حالت اجرا میبره و به یک برنامه با ارزش تبدیل میکند
سورس کدها بجز یکسری دستورالعمل چیزی نیستند و بخودی خود هیچ ارزشی ندارن مگر اینکه اجرا شده و با انتزاع منابع عمل میکند
توسعه دهندگان هنگام نوشتن کد حافظهای رو برای ذخیره، فایلهایی جهت خواندن و نوشتن و سخت افزارهایی برای ارسال سیگنال به آنرا ندارند
منابع واقعی باید در زمان اجرا فراهم شوند، انتزاع ارائه شده توسط سیستم عامل برای یک برنامه در حال اجرا همان چیزیست که ما بهش فرآیند میگوییم
در سطح دستورالعمل ماشین هیچ مفهومی از فرآیند وجود ندارد
هدف از فرآیندها در سیستم عامل، جداسازی وظایف و تخصیص منابع جهت اجرای انهاست، تمام لرآیندها منابع مشترک دارند و توسط سیستم عامل مدیریت میشوند جهت اطلاع سیستم عامل از رابطه بین فرآیندها و منابع، هر فرآیند باید فضای آدرس مستقل و جدول فایل خود را داشته باشد
فرآیندها واحد تخصیص منابع در سیستم عامل هستند
سیستم عامل برای فرآیندها توهم مالکیت کامل رایانه رو ایجاد میکنند حتی اگر بطور همزمان اجرا شوند ،مزیت فرآیندها استقلال کامل و جداسازی اجرای انها از بقیه سیستم، جلوگیری از تداخل و عدم تاثیر گذاری خرابی یکی بر بقیه است
اما یک ضعف دارد اگر فرایندی نیاز به ارتباط با فرآیند دیگر داشته باشد ذاتا فرآیندها این رو ندارن و این موجب میشه از یکسری مکانیسم استفاده کنیم که معمولا چندین مرتبه از دسترسی مستقیم به دادهها کندتر است
نگاهی به درون فرآیند تصویر اول در کامنتها
فرایند فقط یک برنامه در حال اجرا است، که با دسترسی به سیستم
بنابراین، یک فرآیند چیزهای زیادی را در بر می گیرد: یک فایل اجرایی، مجموعه منابع مورد استفاده (فایل ها، اتصالات و غیره) و فضای آدرس با متغیرهای داخلی. به همه اینها زمینه اجرا می گویند. شروع فرآیند همیشه یک کار سنگین بوده است
یک فرآیند میتواند فرآیندهای خود را اجرا کند که به آنها فرآیندها فرزند میگویند و کامل مستقل هستند حافظه و و فضای نام خود را دارند تصویر دوم در کامنتها
درک این موضوع در کد راحتتر از تئوری آن است کدهای فرآیند در کامنتها
لینک وبسایت
#concurrency
@code_crafters
ساخت بلوکهای همزمانی
همزمانی شامل تجزیه برنامه به واحدهای مستقل است، در فصول قبل سخت افزار رو بررسی کردیم و در سیستمهای مدرن برای همزمانی با استفاده از انتزاعی که سیستم عامل بر روی سخت افزار انجام میدهد میتوانیم همزمانی رو پیش ببریم، در این فصل به این موضوع میپردازیم که توسعه دهندگان برنامه خود را چطور با کمک سیستم عامل در استفاده بهینه از سخت افزار ساختار میدهند
مراحل برنامه نویسی همزمان
برنامه نویسی همزمان مجموعهای از انتزاعها است که به توسعه دهندگان این اجازه رو میده تا برنامه خودشون رو به وظابفی کوچک و مستقل ساختار داده و از طریق سیستم زمان اجرا (system runtime) جهت اجرا در صف انتقال دهند، سیستم زمان اجرا منابع رو برای استفاده بهینه هماهنگ کرده و وظایف رو برای اجرا در منابع ارسال میکند، دو انتزاع برای اینکار در همزمانی وجود دارد فرآیندها و رشتهها
فرایندها(processes)
فرآیند خود یک برنامه است که روی دیسک مینشیند یک مجموعه دستورالعملها رو نشون میده که منتظر اجرا هستند، سیستم عامل این دستورالعمل هارو میگیره به حالت اجرا میبره و به یک برنامه با ارزش تبدیل میکند
سورس کدها بجز یکسری دستورالعمل چیزی نیستند و بخودی خود هیچ ارزشی ندارن مگر اینکه اجرا شده و با انتزاع منابع عمل میکند
توسعه دهندگان هنگام نوشتن کد حافظهای رو برای ذخیره، فایلهایی جهت خواندن و نوشتن و سخت افزارهایی برای ارسال سیگنال به آنرا ندارند
منابع واقعی باید در زمان اجرا فراهم شوند، انتزاع ارائه شده توسط سیستم عامل برای یک برنامه در حال اجرا همان چیزیست که ما بهش فرآیند میگوییم
در سطح دستورالعمل ماشین هیچ مفهومی از فرآیند وجود ندارد
هدف از فرآیندها در سیستم عامل، جداسازی وظایف و تخصیص منابع جهت اجرای انهاست، تمام لرآیندها منابع مشترک دارند و توسط سیستم عامل مدیریت میشوند جهت اطلاع سیستم عامل از رابطه بین فرآیندها و منابع، هر فرآیند باید فضای آدرس مستقل و جدول فایل خود را داشته باشد
فرآیندها واحد تخصیص منابع در سیستم عامل هستند
سیستم عامل برای فرآیندها توهم مالکیت کامل رایانه رو ایجاد میکنند حتی اگر بطور همزمان اجرا شوند ،مزیت فرآیندها استقلال کامل و جداسازی اجرای انها از بقیه سیستم، جلوگیری از تداخل و عدم تاثیر گذاری خرابی یکی بر بقیه است
اما یک ضعف دارد اگر فرایندی نیاز به ارتباط با فرآیند دیگر داشته باشد ذاتا فرآیندها این رو ندارن و این موجب میشه از یکسری مکانیسم استفاده کنیم که معمولا چندین مرتبه از دسترسی مستقیم به دادهها کندتر است
نگاهی به درون فرآیند تصویر اول در کامنتها
فرایند فقط یک برنامه در حال اجرا است، که با دسترسی به سیستم
داده هایی که فرآیند می خواند یا می نویسد در حافظه ذخیره می شود. بنابراین، حافظه ای که فرآیند می تواند ببیند یا به آن دسترسی داشته باشد (فضای آدرس) بخشی از فرآیند در حال اجرا است.
• فایل اجرایی با تمام دستورالعمل های ماشین بخشی از فرآیند است.
• فرآیند همچنین به یک شناسه نیاز دارد: یک نام منحصر به فرد که فرآیند را می توان با آن شناسایی کرد. به آن شناسه فرآیند (PID) می گویند.
• در نهایت، برنامه ها اغلب به دیسک ها، منابع شبکه یا سایر دستگاه های شخص ثالث دسترسی دارند. چنین اطلاعاتی باید شامل فهرستی از فایلهایی باشد که در حال حاضر توسط فرآیند باز میشوند، اتصالات شبکه باز و هرگونه اطلاعات اضافی درباره منابعی که استفاده میکند.
بنابراین، یک فرآیند چیزهای زیادی را در بر می گیرد: یک فایل اجرایی، مجموعه منابع مورد استفاده (فایل ها، اتصالات و غیره) و فضای آدرس با متغیرهای داخلی. به همه اینها زمینه اجرا می گویند. شروع فرآیند همیشه یک کار سنگین بوده است
فرآیندها معمولاً توسط سیستم عامل ایجاد می شوند. علاوه بر ایجاد فرآیندها، سیستم عامل مسئولیت خاتمه فرآیند را نیز بر عهده دارد. این یک کار پیش پا افتاده نیست. سیستم عامل باید بفهمد که فرآیند به پایان رسیده است - یا کار کامل شده است، فرآیند ناموفق است و زمان پاکسازی آن فرا رسیده است، یا فرآیند والد تمام شده است. ایجاد یا خاتمه یک فرآیند نسبتاً پرهزینه است زیرا همانطور که دیدیم، یک فرآیند منابع زیادی به آن متصل است و باید ایجاد یا آزاد شوند. انجام این کار به زمان سیستم نیاز دارد و تاخیر اضافی را معرفی می کند.
یک فرآیند میتواند فرآیندهای خود را اجرا کند که به آنها فرآیندها فرزند میگویند و کامل مستقل هستند حافظه و و فضای نام خود را دارند تصویر دوم در کامنتها
درک این موضوع در کد راحتتر از تئوری آن است کدهای فرآیند در کامنتها
لینک وبسایت
#concurrency
@code_crafters
رشتهها threads
اشتراک گذاری حافظه بین فرآیندها در اکثر سیستم عامل ها امکان پذیر است، اما به موارد اضافی نیاز دارد که تلاش بیشتری طلب میکند، اما یک مفهوم دیگر که در اشتراک حافظه یک بیت بیشتر به ما کمک میکند وحود دارد:رشته
یک برنامه به سادگی مجموعه ای از دستورالعمل های ماشین است که باید پشت سر هم اجرا شوند برای تحقق این امر سیستم عامل از مفهوم رشته استفاده میکند
رشتهها با این ایده متولد شدن که کارآمدترین راه برای اشتراک گذاری فضای ادرس مشترک هستند تصویر اول در کامنتها
رشتهها در یک فرآیند واحد، مانند فرآیندهایی هستند که میتوانند به راحتی منابع را با یکدیگر و فرآیند اصلی خود به اشتراک بگذارند
رشتهها وضعیت خود را حفظ میکنند تا مستقل از بقیه اجرا شوند، همچنین رشتهها از حضور بقیه رشتهها بی اطلاع هستند مگر اینکه باهم تداخلی داشته باشند
سیستم عامل رشتهها رو مدیریت میکند و میتواند بین چند پردازنده آنها را اجرا کند بنابراین رشتهها گزینه خوبی برای اجرای همزمانی هستند
مزایای استفاده از رشتهها نسبت به فرآیندها
ضعف رشتهها
فرایندها در سطح سیستم عامل کاملا مستقل از همدیگه هستند، در صورت خراب شدن یکی بر دیگری تاثیری نمیگذارد، اما رشتهها چون در یک فرآیند اجرا میشوند در صورت خرابی یکی ممکنه موجب خرابی بقیه هم بشه، لذا برنامه نویسان باید در دسترسی به منابع بین رشتهها همگام سازی کنند و کنترل بیشتری بر رفتار آنها اعمال کنند
کد رشتهها در کامنت
لینک وبسایت
#concurrency
@code_crafters
اشتراک گذاری حافظه بین فرآیندها در اکثر سیستم عامل ها امکان پذیر است، اما به موارد اضافی نیاز دارد که تلاش بیشتری طلب میکند، اما یک مفهوم دیگر که در اشتراک حافظه یک بیت بیشتر به ما کمک میکند وحود دارد:رشته
یک برنامه به سادگی مجموعه ای از دستورالعمل های ماشین است که باید پشت سر هم اجرا شوند برای تحقق این امر سیستم عامل از مفهوم رشته استفاده میکند
گفتیم یک فرآیند یک برنامه در حال اجرا به اضافه منابع است، اگر برنامه را به اجزای جداگانه تقسیم کنیم، یک فرآیند محفظه ای از منابع (فضای آدرس، فایل ها، اتصالات و غیره) است و یک رشته یک بخش پویا است - دنباله ای از دستورالعمل ها که در داخل این ظرف اجرا می شوند. بنابراین، در زمینه سیستم عامل، یک فرآیند را می توان به عنوان واحدی از منابع در نظر گرفت، در حالی که یک رشته را می توان به عنوان واحد اجرا مشاهده کرد
رشتهها با این ایده متولد شدن که کارآمدترین راه برای اشتراک گذاری فضای ادرس مشترک هستند تصویر اول در کامنتها
رشتهها در یک فرآیند واحد، مانند فرآیندهایی هستند که میتوانند به راحتی منابع را با یکدیگر و فرآیند اصلی خود به اشتراک بگذارند
رشتهها وضعیت خود را حفظ میکنند تا مستقل از بقیه اجرا شوند، همچنین رشتهها از حضور بقیه رشتهها بی اطلاع هستند مگر اینکه باهم تداخلی داشته باشند
سیستم عامل رشتهها رو مدیریت میکند و میتواند بین چند پردازنده آنها را اجرا کند بنابراین رشتهها گزینه خوبی برای اجرای همزمانی هستند
اکثر سازندگان سخت افزار از Pthreads استفاده می کنند، که یک استادارد IEEE می باشد
در این استاندارد، هر برنامه ای که اجرا می کنیم باعث می شود سیستم عامل یک فرآیند ایجاد کند و هر فرآیند حداقل یک رشته دارد. یک فرآیند بدون رشته نمی تواند وجود داشته باشد. هر رشته همچنین زمینه اجرای مستقل خود را حفظ می کند تا اطمینان حاصل شود که دستورالعمل های آن به طور ایمن و مستقل اجرا می شوند
مزایای استفاده از رشتهها نسبت به فرآیندها
۱: فرآیندها کاملاً مستقل هستند، هر کدام دارای فضای آدرس، مجموعهای از رشتهها و کپیهایی از متغیرها هستند که کاملاً مستقل از همان متغیرها در سایر فرآیندها هستند رشته ها نسبت به عملکرد استاندارد fork() سربار حافظه کمتری دارند زیرا رشته والد کپی نمی شود رشته ها از همان فرآیند استفاده می کنند.به همین دلیل، رشته ها را گاهی اوقات فرآیندهای سبک وزن نیز می نامند
در نتیجه، ما میتوانیم رشتههای بیشتری نسبت به فرآیندهای روی یک سیستم ایجاد کنیم
ایجاد و پایان دادن به رشته ها سریعتر از فرآیندها است زیرا زمان کمتری را برای سیستم عامل برای تخصیص و مدیریت منابع نخ نیاز دارد.به همین دلیل، میتوانیم هر زمان که در برنامهای منطقی بود، رشتههایی ایجاد کنیم و نگران اتلاف زمان و حافظه پردازنده نباشیم
۲: هزینه ارتباط کمتر، هر فرآیند با حافظه خاص خود کار می کند.فرآیندها فقط می توانند چیزی را از طریق یک مکانیسم ارتباطی فرآیندی مبادله کنند
رشتهها از فضای آدرس یکسانی استفاده میکنند و بنابراین میتوانند با نوشتن و خواندن در فضای آدرس مشترک فرآیند والد خود بدون هیچ مشکلی یا سربار با یکدیگر ارتباط برقرار کنند: هر چیزی که توسط یک رشته تغییر کند بلافاصله در دسترس همه است
از این رو، برای سیستم های SMP که به طور گسترده مورد استفاده قرار می گیرند، گاهی اوقات استفاده از رشته ها بسیار راحت تر از فرآیندها است
ضعف رشتهها
فرایندها در سطح سیستم عامل کاملا مستقل از همدیگه هستند، در صورت خراب شدن یکی بر دیگری تاثیری نمیگذارد، اما رشتهها چون در یک فرآیند اجرا میشوند در صورت خرابی یکی ممکنه موجب خرابی بقیه هم بشه، لذا برنامه نویسان باید در دسترسی به منابع بین رشتهها همگام سازی کنند و کنترل بیشتری بر رفتار آنها اعمال کنند
کد رشتهها در کامنت
لینک وبسایت
#concurrency
@code_crafters