تسلط بر همزمانی در Go با استفاده از کانال‌ها

من زمانی یک pipeline پردازش تصویر در Go ساختم.

برای هر مرحله از goroutineها استفاده کردم. آن‌ها را با کانال‌ها به هم متصل کردم. دکمه اجرا را زدم.

برنامه هنگ کرد. مصرف حافظه بالا رفت. سپس از کار افتاد. هیچ خطایی وجود نداشت. فقط سکوت بود.

ساعت‌ها وقت صرف عیب‌یابی یک scheduler خراب کردم. اشتباه می‌کردم. من نمی‌دانستم کانال‌ها چگونه کار می‌کنند.

در اینجا سه قانون برای جلوگیری از هنگ کردن برنامه‌های Go آورده شده است.

۱. کانال‌های Nil مانند سیاهچاله‌ها هستند یک کانال nil برای همیشه مسدود می‌ماند. اگر روی یک کانال nil داده‌ای بفرستید یا دریافت کنید، goroutine در همان‌جا گیر می‌کند.

۲. قوانین بستن کانال از panic جلوگیری می‌کنند بستن یک کانال، دائمی است.

۳. برای امنیت بیشتر، از جهت‌های کانال استفاده کنید Go به شما اجازه می‌دهد مشخص کنید که یک کانال برای ارسال است یا دریافت.

چگونه یک pipeline تمیز بسازیم:

وقتی از این الگوها پیروی می‌کنید، از نشت (leaks) و panic جلوگیری می‌کنید. شما سیستم‌هایی می‌سازید که تست کردن آن‌ها آسان و مستحکم (robust) است.

چالش شما: تابعی بنویسید که چندین کانال ورودی را در یک کانال خروجی ادغام (merge) کند. از یک حلقه select استفاده کنید. یک timeout ۵۰۰ میلی‌ثانیه‌ای اضافه کنید. مطمئن شوید که هیچ goroutine ای نشت نمی‌کند.

راه حل خود را در کامنت‌ها قرار دهید.

Source: https://dev.to/timevolt/go-concurrency-the-jedis-guide-to-goroutines-channels-may-the-fork-be-with-you-2g79