همزمانی بدون ترس
مدیریت برنامهنویسی همزمان به صورت ایمن و کارآمد یکی از اهداف اصلی Rust است. برنامهنویسی همزمان، جایی که بخشهای مختلف یک برنامه به صورت مستقل اجرا میشوند، و برنامهنویسی موازی، جایی که بخشهای مختلف یک برنامه به صورت همزمان اجرا میشوند، در حال تبدیل شدن به جنبههای فزایندهای مهم هستند زیرا تعداد بیشتری از کامپیوترها از پردازندههای چندگانه خود استفاده میکنند. به طور تاریخی، برنامهنویسی در این زمینهها سخت و مستعد خطا بوده است: Rust امیدوار است این موضوع را تغییر دهد.
در ابتدا، تیم Rust فکر میکرد که تضمین ایمنی حافظه و جلوگیری از مشکلات همزمانی دو چالش جداگانه هستند که باید با روشهای متفاوت حل شوند. با گذشت زمان، تیم دریافت که سیستمهای مالکیت و نوع مجموعهای قدرتمند از ابزارها هستند که به مدیریت ایمنی حافظه و مشکلات همزمانی کمک میکنند! با استفاده از مالکیت و بررسی نوع، بسیاری از خطاهای همزمانی در Rust به جای خطاهای زمان اجرا، به خطاهای زمان کامپایل تبدیل میشوند. بنابراین، به جای اینکه وقت زیادی را صرف بازتولید دقیق شرایطی کنید که در آن یک خطای همزمانی در زمان اجرا رخ میدهد، کد نادرست از کامپایل خودداری کرده و یک خطا ارائه میدهد که مشکل را توضیح میدهد. در نتیجه، میتوانید کد خود را در حین کار روی آن برطرف کنید، به جای اینکه احتمالاً بعد از ارسال آن به تولید. ما این جنبه از Rust را همزمانی بدون ترس نامیدهایم. همزمانی بدون ترس به شما امکان میدهد کدی بنویسید که بدون باگهای ظریف باشد و به راحتی بازسازی شود بدون اینکه باگهای جدید معرفی کند.
نکته: برای سادگی، ما به بسیاری از مشکلات به عنوان همزمان اشاره خواهیم کرد به جای اینکه دقیقتر بگوییم همزمان و/یا موازی. اگر این کتاب درباره همزمانی و/یا موازی بودن بود، دقیقتر بودیم. برای این فصل، لطفاً هر جا که از همزمان استفاده میکنیم، به صورت ذهنی همزمان و/یا موازی را جایگزین کنید.
بسیاری از زبانها درباره راهحلهایی که برای مدیریت مشکلات همزمان ارائه میدهند بسیار دگماتیک هستند. برای مثال، Erlang عملکرد زیبا و کارآمدی برای همزمانی مبتنی بر پیامرسانی ارائه میدهد اما فقط روشهای پیچیدهای برای اشتراک وضعیت بین نخها دارد. پشتیبانی از یک زیرمجموعه از راهحلهای ممکن یک استراتژی منطقی برای زبانهای سطح بالا است، زیرا یک زبان سطح بالا وعدههایی در ازای از دست دادن بخشی از کنترل برای به دست آوردن انتزاعها ارائه میدهد. با این حال، از زبانهای سطح پایین انتظار میرود که بهترین راهحل را برای هر وضعیت خاص با بهترین عملکرد ارائه دهند و انتزاع کمتری نسبت به سختافزار داشته باشند. بنابراین، Rust مجموعهای از ابزارها را برای مدلسازی مشکلات در هر راهی که برای وضعیت و نیازهای شما مناسب باشد، ارائه میدهد.
موضوعاتی که در این فصل پوشش خواهیم داد عبارتاند از:
- نحوه ایجاد نخها برای اجرای همزمان چندین بخش از کد
- همزمانی پیامرسانی، جایی که کانالها پیامها را بین نخها ارسال میکنند
- همزمانی حالت اشتراکی، جایی که چندین نخ به بخشی از داده دسترسی دارند
- صفات
Sync
وSend
، که تضمینهای همزمانی Rust را به انواع تعریفشده توسط کاربر و همچنین انواع ارائهشده توسط کتابخانه استاندارد گسترش میدهند