|
در مثال قبل از قفلگذاری صریح با میوتکسها برای همگامسازی دسترسی به وضعیت مشترک بین چند گوروتین استفاده کردیم. گزینهٔ دیگر این است که از قابلیتهای همگامسازی داخلی گوروتینها و کانالها برای رسیدن به همان نتیجه استفاده کنیم. این رویکرد مبتنی بر کانال با ایدهٔ Go هماهنگ است: به اشتراک گذاشتن حافظه از طریق ارتباط، و اینکه هر تکه داده دقیقاً متعلق به یک گوروتین باشد. |
|
![]()
|
|
|
|
|
در این مثال وضعیت ما متعلق به یک گوروتین واحد است. این
تضمین میکند که دادهها هرگز با دسترسی همزمان خراب
نشوند. برای خواندن یا نوشتن آن وضعیت، گوروتینهای دیگر
به گوروتینِ مالک پیام میفرستند و پاسخ متناظر را
دریافت میکنند. این |
|
|
|
|
مثل قبل، تعداد عملیاتی را که انجام میدهیم میشماریم. |
|
|
گوروتینهای دیگر از کانالهای |
|
|
این گوروتینی است که مالک |
|
|
این بخش ۱۰۰ گوروتین راه میاندازد که از طریق کانال
|
|
|
۱۰ نوشتن را هم با روشی مشابه راه میاندازیم. |
|
|
اجازه میدهیم گوروتینها یک ثانیه کار کنند. |
|
|
در نهایت، تعداد عملیات را میخوانیم و گزارش میدهیم. |
|
|
اجرای برنامه نشان میدهد که مثال مدیریت وضعیت مبتنی بر گوروتین، در مجموع حدود ۸۰٬۰۰۰ عملیات انجام میدهد. |
|
|
در این مورد خاص، رویکرد مبتنی بر گوروتین کمی پیچیدهتر از رویکرد مبتنی بر میوتکس بود. اما در برخی موارد میتواند مفید باشد؛ مثلاً وقتی کانالهای دیگری هم درگیرند یا وقتی مدیریت چندین میوتکس مستعد خطاست. از هر رویکردی که طبیعیتر به نظر میرسد استفاده کنید، بهویژه از نظر فهم درستی برنامهتان. |
مثال بعدی: مرتبسازی.