حالت تاریک
پیشگفتار
سلام، به Concurrency in Go خوش آمدید! خوشحالم که این کتاب را برداشتهاید و هیجانزدهام که در شش فصل پیش رو همراه شما موضوع همزمانی در Go را کاوش کنیم!
Go زبان فوقالعادهای است. وقتی برای اولین بار معرفی و به دنیا عرضه شد، یادم است با علاقهٔ زیاد آن را بررسی کردم: مختصر بود، فوقالعاده سریع compile میشد، عملکرد خوبی داشت، duck typing را پشتیبانی میکرد و — به خوشحالی من — کار با primitiveهای همزمانیاش intuitive بود. اولین باری که از keyword go برای ساخت goroutine استفاده کردم (قول میدهم پوشش میدهیم!) لبخند احمقانهای روی صورتم نشست. با همزمانی در چند زبان کار کرده بودم، اما هرگز در زبانی کار نکرده بودم که همزمانی را اینقدر آسان کند (یعنی نمیگویم چنین زبانهایی وجود ندارند؛ فقط من از هیچکدام استفاده نکرده بودم). راهم به Go افتاده بود.
در طول سالها از نوشتن اسکریپتهای شخصی در Go به پروژههای شخصی رسیدم، تا اینکه خودم را درگیر پروژهای حرفهای با صدها هزار خط کد دیدم. در این مسیر جامعه همراه با زبان رشد میکرد و ما بهصورت جمعی best practiceهای کار با همزمانی در Go را کشف میکردیم. چند نفر دربارهٔ الگوهایی که کشف کرده بودند سخنرانی دادند. اما هنوز راهنمای جامعی دربارهٔ چگونگی بهکارگیری همزمانی در Go در جامعه نبود.
با این ذهنیت بود که نوشتن این کتاب را شروع کردم. میخواستم جامعه به اطلاعات باکیفیت و جامع دربارهٔ همزمانی در Go دسترسی داشته باشد: چگونه از آن استفاده کند، best practiceها و الگوها برای گنجاندن آن در سیستمهایتان، و اینکه همهچیز زیر پوست چگونه کار میکند. بهترین تلاشم را کردم تا بین این دغدغهها تعادل برقرار کنم.
امیدوارم این کتاب مفید واقع شود!
چه کسانی باید این کتاب را بخوانند
این کتاب برای developerهایی است که تجربهای با Go دارند؛ هیچ تلاشی برای توضیح syntax پایهٔ زبان نمیکنم. آشنایی با نحوهٔ ارائهٔ همزمانی در زبانهای دیگر مفید است، اما ضروری نیست.
تا پایان این کتاب کل پشتهٔ دغدغههای همزمانی Go را بررسی کردهایم: دامهای رایج همزمانی، انگیزههای پشت طراحی همزمانی Go، syntax پایهٔ primitiveهای همزمانی Go، الگوهای رایج همزمانی، الگوهای الگوها، و ابزارهای مختلفی که در مسیر کمکتان میکنند.
بهخاطر گستردگی موضوعات، این کتاب برای بخشهای مختلفی از افراد مفید است. بخش بعد به شما کمک میکند بسته به نیازتان در کتاب جابهجا شوید.
پیمایش این کتاب
وقتی کتابهای فنی میخوانم، معمولاً به بخشهایی میپرم که علاقهام را برمیانگیزند. یا اگر میخواهم برای کار روی فناوری جدیدی سریع بالا بیایم، با عجله بخشهای فوراً مرتبط با کارم را مرور میکنم. هر use caseای که دارید، این نقشهٔ راه کتاب است — با امید اینکه شما را به جایی که باید باشید هدایت کند!
فصل ۱، مقدمهای بر همزمانی این فصل دیدگاه تاریخی گستردهای از چرایی اهمیت همزمانی میدهد و برخی مشکلات بنیادی که همزمانی را سخت میکنند را بحث میکند. همچنین بهاختصار به چگونگی کمک Go برای سبکتر کردن این بار میپردازد.
اگر دانش عملی از همزمانی دارید یا فقط میخواهید به جنبههای فنی استفاده از primitiveهای همزمانی Go برسید، میتوانید با خیال راحت از این فصل بگذرید.
فصل ۲، مدلسازی کد شما: Communicating Sequential Processes این فصل با برخی عوامل انگیزشی که در طراحی Go نقش داشتند سر و کار دارد. این به شما contextی برای گفتوگو با دیگران در جامعهٔ Go میدهد و درک شما را از چرایی کارکردن چیزها در زبان frame میکند.
فصل ۳، بلوکهای سازندهٔ همزمانی Go اینجا syntax primitiveهای همزمانی Go را بررسی میکنیم. همچنین package sync را پوشش میدهیم که مسئول همگامسازی دسترسی به حافظه در Go است. اگر قبلاً در Go از همزمانی استفاده نکردهاید و میخواهید مستقیم وارد شوید، اینجا نقطهٔ شروع است.
در میان مبانی نوشتن کد concurrent در Go، مقایسههایی با مفاهیم زبانها و مدلهای همزمانی دیگر آمده است. صرفنظر از نظر فنی، درک این مفاهیم برای فهم کامل همزمانی در Go لازم نیست، اما کمک میکند.
فصل ۴، الگوهای همزمانی در Go در این فصل میبینیم primitiveهای همزمانی Go چگونه با هم ترکیب میشوند تا الگوهای مفید بسازند. این الگوها هم به حل مشکلات کمک میکنند و هم از مسائلی که با ترکیب primitiveهای همزمانی پیش میآید جلوگیری میکنند.
اگر قبلاً کمی کد concurrent در Go نوشتهاید، این فصل باز هم مفید خواهد بود.
فصل ۵، همزمانی در مقیاس در این فصل الگوهایی که یاد گرفتهایم را ترکیب میکنیم تا الگوهای بزرگتری بسازیم که معمولاً در برنامهها، سرویسها و سیستمهای توزیعشدهٔ بزرگتر بهکار میروند.
فصل ۶، Goroutineها و Go Runtime این فصل توضیح میدهد Go runtime چگونه scheduling goroutineها را انجام میدهد. برای کسانی است که میخواهند internals runtime Go را بفهمند.
پیوست پیوست بهسادگی ابزارها و دستورات مختلفی را فهرست میکند که نوشتن و debug برنامههای concurrent را آسانتر میکنند.
منابع آنلاین
Go جامعهٔ بسیار فعال و پرشوری دارد! برای کسانی که تازهکار Go هستند، دلگرم باشید — پیدا کردن gopherهای دوستانه و کمککننده برای هدایت در مسیر Go آسان است. چند منبع موردعلاقهٔ من با گرایش جامعهای برای خواندن، دریافت کمک و تعامل با هم-gopherها:
- https://golang.org/
- https://golang.org/play
- https://go.googlesource.com/go
- https://groups.google.com/group/golang-nuts
- https://github.com/golang/go/wiki
قراردادهای بهکاررفته در این کتاب
قراردادهای تایپوگرافیک زیر در این کتاب استفاده شدهاند:
Italic : نشاندهندهٔ اصطلاحات جدید، URLها، آدرس ایمیل، نام فایلها و پسوندهای فایل است.
Constant width : برای فهرست برنامهها و همچنین درون پاراگرافها برای اشاره به عناصر برنامه مثل نام متغیر یا تابع، پایگاهدادهها، نوع داده، متغیرهای محیطی، statementها و keywordها بهکار میرود.
Constant width bold : دستورات یا متنی را نشان میدهد که کاربر باید عیناً تایپ کند.
Constant width italic : متنی را نشان میدهد که باید با مقادیر کاربر یا مقادیر تعیینشده از context جایگزین شود.
💡 این نماد نشاندهندهٔ نکته، پیشنهاد یا یادداشت عمومی است.
⚠️ این نماد نشاندهندهٔ هشدار یا احتیاط است.
استفاده از نمونههای کد
همهٔ کدهای این کتاب در صفحهٔ فرود کتاب یافت میشوند: http://katherine.cox-buday.com/concurrency-in-go. تحت مجوز MIT منتشر شده و میتوانید طبق همان شرایط استفاده کنید.
O'Reilly Safari
Safari (قبلاً Safari Books Online) پلتفرم عضویتی آموزش و مرجع برای enterprise، دولت، educatorها و افراد است.
اعضا به هزاران کتاب، ویدیوی آموزشی، Learning Path، آموزش تعاملی و playlistهای curated از بیش از ۲۵۰ ناشر — از جمله O'Reilly Media، Harvard Business Review، Prentice Hall Professional، Addison-Wesley Professional، Microsoft Press، Sams، Que، Peachpit Press، Adobe، Focal Press، Cisco Press، John Wiley & Sons، Syngress، Morgan Kaufmann، IBM Redbooks، Packt، Adobe Press، FT Press، Apress، Manning، New Riders، McGraw-Hill، Jones & Bartlett و Course Technology — دسترسی دارند.
برای اطلاعات بیشتر به http://oreilly.com/safari مراجعه کنید.
نحوهٔ تماس با ما
لطفاً نظرات و سؤالات مربوط به این کتاب را به ناشر ارسال کنید:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
800-998-9938 (in the United States or Canada)
707-829-0515 (international or local)
707-829-0104 (fax)
صفحهٔ وب مخصوص این کتاب داریم که errata، نمونهها و اطلاعات تکمیلی را فهرست میکند. میتوانید از http://bit.ly/concurrency-in-go به این صفحه دسترسی داشته باشید.
برای نظر یا سؤال فنی دربارهٔ این کتاب، ایمیل به bookquestions@oreilly.com بفرستید.
برای اطلاعات بیشتر دربارهٔ کتابها، دورهها، کنفرانسها و اخبار، وبسایت http://www.oreilly.com را ببینید.
ما را در Facebook پیدا کنید: http://facebook.com/oreilly ما را در Twitter دنبال کنید: http://twitter.com/oreillymedia ما را در YouTube تماشا کنید: http://www.youtube.com/oreillymedia
قدردانی
نوشتن کتاب کاری سخت و چالشبرانگیز است. آنچه پیش روی شماست بدون تیمی که از من حمایت کرد، چیزها را بازبینی کرد، ابزار نوشت و به سؤالات پاسخ داد ممکن نبود. عمیقاً سپاسگزار همهٔ کسانی هستم که کمک کردند و صمیمانهترین تشکر را دارم. این کار را با هم انجام دادیم!
یک پرنده تابستان نمیسازد... — ضربالمثل
- Alan Donovan، که در proposal اولیه کمک کرد و مرا در مسیر گذاشت.
- Andrew Wilkins، که خوششانس بودم در Canonical با او کار کنم. بینش، حرفهایگری و هوشش بر این کتاب تأثیر گذاشت و بازبینیهایش آن را بهتر کرد.
- Ara Pulido، که کمک کرد این کتاب را از چشم یک gopher تازه ببینم.
- Dawn Schanafelt، ویراستارم، که سهم بزرگی در خوانا کردن این کتاب داشت. بهویژه از صبرش (و O'Reilly) قدردانی میکنم وقتی زندگی در مسیر نوشتن چند دشواری روی راهم گذاشت.
- Francesc Campoy، که کمک کرد همیشه gopherهای تازهکار را در نظر داشته باشم.
- Ivan Daniluk، که توجه به جزئیات و علاقهاش به همزمانی کمک کرد این کتاب جامع و مفید باشد.
- Yasushi Shoji، که org-asciidoc را نوشت — ابزاری که برای export artifactهای AsciiDoc از Org mode استفاده کردم. نمیدانست دارد به نوشتن کتاب کمک میکند، اما همیشه به bug reportها و سؤالات پاسخگو بود!
- maintainers Go: از تعهدتان سپاسگزارم.
- maintainers Org mode، mode GNU Emacs که با آن این کتاب نوشته شده. کل زندگیام در org است؛ جدی، ممنون همه.
- maintainers GNU Emacs، ویرایشگری که این کتاب را در آن نوشتم. ابزاری نمیشناسم که بیشتر در زندگیام اهرم بوده باشد.
- کتابخانههای عمومی St. Louis که بیشتر این کتاب در آنها نوشته شد.