فراوانی حروف را در متنها با استفاده از محاسبات موازی بشمارید.
موازیسازی یعنی کارهایی را بهصورت موازی انجام دهیم که میتوان آنها را بهصورت متوالی هم انجام داد. یک مثال رایج، شمردن فراوانی حروف است.
برای محاسبهی فراوانی کل هر حرف در فهرستی از متنها، از موازیسازی استفاده کنید.
زبان Go همروندی را از طریق «گوروتینها» پشتیبانی میکند که با کلیدواژهی go شروع میشوند.
این روش ساده، سبک و ظریف است و یکی از بزرگترین نقاط قوت این زبان به شمار میرود.
ممکن است متوجه شوید که با اینکه اسم این تمرین Parallel letter frequency است، اصطلاح «Parallel» را در Go چندان زیاد نمیبینید. Gopherها ترجیح میدهند برای توصیف مدیریت چندین گوروتین مستقل، از اصطلاح «Concurrent» استفاده کنند («فرایندها» یا «تردها» در بافت زبانهای دیگر). هرچند این دو اصطلاح اغلب بهجای هم به کار میروند، Gopherها دوست دارند از نظر فنی دقیق باشند و هنگام بحث دربارهی اجرای بهظاهر همزمان گوروتینها، از «concurrent» استفاده میکنند.
اگرچه میتوانیم برنامهریزی کنیم که برنامههایمان موازی اجرا شوند و گاهی ممکن است موازی به نظر برسند، اما بدون آگاهی دقیق از بافت اجرای کدمان، تنها تضمین ما این است که فرایندها همروند اجرا خواهند شد. به عبارت دیگر، ممکن است بهصورت ترتیبی و سریعتر از آنچه بتوانیم تشخیص دهیم اجرا شوند، اما نه دقیقاً همزمان.
برای اطلاعات بیشتر، نگاهی به نوشتهی وبلاگ Go بیندازید: Concurrency is not parallelism.
اگر با قابلیتهای همروندی در Go آشنایی ندارید، اینجا چند منبع برای شروع کار با آن آورده شده است. توصیه میکنیم پیش از شروع این تمرین، نگاهی به آنها بیندازید:
اگر به دنبال کاوش عمیقتری هستید، میتوانید کتاب Concurrency in Go نوشتهی @kat-co را امتحان کنید.
در این تمرین، تستهای واحد نمیتوانند تعیین کنند که آیا راهحل همروند خوبی نوشتهاید.
بهجای آن، بهتر است این تمرین را بهصورت محلی حل کنید و بنچمارکها را با go test -bench . اجرا کنید.
برای یک راهحل خوب، باید ببینید که نسخهی همروند در هر عملیات (ns/op) نانوثانیهی کمتری نسبت به نسخهی ترتیبی نشان میدهد.
در Exercism ثبتنام کنید تا Go را همراه با 34 مفهوم165 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.
ما تفاوتهای میان همروندی و موازیسازی را بررسی میکنیم و به رویکردهای متفاوتی که زبانهایی مانند JavaScript، Go، Elixir و Rust در پیش میگیرند نگاه میکنیم.