برنامه نویسی

الگوی Fanout در Go – انجمن DEV

Summarize this content to 400 words in Persian Lang
بیایید نگاهی گذرا به الگوی fanout در Go بیندازیم. به طور کلی، fanout برای انجام تعدادی کار به طور همزمان استفاده می شود.

به عنوان مثال، فرض کنید که یک خط لوله داده دارید و می خواهید موارد جداگانه را پردازش کنید. می‌توانیم از روتین‌ها و کانال‌های go استفاده کنیم تا آیتم‌ها را هنگام دریافت آن‌ها تقسیم کنیم، سپس آیتم‌های جداگانه را پردازش کنیم (مثلاً یک دسی‌بل قرار دهید).

این یک الگوی ساده برای پیاده سازی است. اما برای جلوگیری از بن بست باید کانال ها را مدیریت کنید.

// produce is simulating our single input as a channel
func produce(id int) chan int {
ch := make(chan int)
go func() {
for i := 0; i

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایده اصلی در اینجا این است که مجموعه ای از داده ها وجود دارد که باید توسط تعداد ثابتی از کارگران مورد استفاده قرار گیرند.

برای ورودی، دنباله ای از اعداد تصادفی ایجاد می کنیم و آنها را در یک کانال قرار می دهیم. ما آنها را به کانال دیگری منتقل می کنیم که کارگران “شغل” خود را از آن بیرون بکشند.

در این مثال، انتقال ورودی به کانال jobs اکیداً ضروری نیست. به همین راحتی می‌توانیم کارگران را از کانال ورودی خارج کنیم. این فقط برای وضوح در اینجا انجام شده است.

سپس تعداد ثابتی از کارگران را به‌عنوان گوروتین ارسال می‌کنیم. هر کارگر از کانال jobs خارج می شود تا زمانی که داده دیگری برای پردازش وجود نداشته باشد و در آن زمان به یک WaitGroup سیگنال دهد که کار انجام شده است.

رشته اصلی از یک WaitGroup استفاده می‌کند تا مطمئن شود تا زمانی که همه کارگران تمام نشده‌اند، یعنی همه کارها پردازش نشده باشند، کامل نمی‌شود.

یک نکته کلیدی قابل ذکر است که این الگو هیچ تضمینی برای ترتیب پردازش توالی ورودی ندارد. این ممکن است در بسیاری از شرایط خوب باشد. به عنوان مثال، توالی ورودی، رکوردهای داده ای هستند که دارای مهر زمانی خود هستند و هدف ذخیره رکوردها در یک دسی بل است. فن اوت در این مورد قابل قبول خواهد بود.

نکته پایانی، پس از ارسال تمام داده‌های موجود در دنباله، نظراتی در مورد بستن کانال‌ها مشاهده خواهید کرد. این مهم است. اپراتور محدوده ای که از کانال ها بیرون می کشد، زمانی که داده دیگری وجود نداشته باشد، به حالت خواب می رود. شما می توانید این را با اظهار نظر یکبار از دستورات ()close که باعث ایجاد یک شرط بن بست می شود، تأیید کنید. گوروتین ها و کانال ها بسیار قدرتمند هستند اما شما باید از آنها عاقلانه استفاده کنید.

چه کاری متفاوت انجام می دهید؟ چگونه می توانیم این مثال را بهبود بخشیم؟ نظرات خود را در زیر بنویسید

با تشکر!

کد این پست و همه پست های این مجموعه را می توانید در اینجا پیدا کنید

بیایید نگاهی گذرا به الگوی fanout در Go بیندازیم. به طور کلی، fanout برای انجام تعدادی کار به طور همزمان استفاده می شود.

به عنوان مثال، فرض کنید که یک خط لوله داده دارید و می خواهید موارد جداگانه را پردازش کنید. می‌توانیم از روتین‌ها و کانال‌های go استفاده کنیم تا آیتم‌ها را هنگام دریافت آن‌ها تقسیم کنیم، سپس آیتم‌های جداگانه را پردازش کنیم (مثلاً یک دسی‌بل قرار دهید).

این یک الگوی ساده برای پیاده سازی است. اما برای جلوگیری از بن بست باید کانال ها را مدیریت کنید.

// produce is simulating our single input as a channel
func produce(id int) chan int {
    ch := make(chan int)
    go func() {
        for i := 0; i 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایده اصلی در اینجا این است که مجموعه ای از داده ها وجود دارد که باید توسط تعداد ثابتی از کارگران مورد استفاده قرار گیرند.

برای ورودی، دنباله ای از اعداد تصادفی ایجاد می کنیم و آنها را در یک کانال قرار می دهیم. ما آنها را به کانال دیگری منتقل می کنیم که کارگران “شغل” خود را از آن بیرون بکشند.

در این مثال، انتقال ورودی به کانال jobs اکیداً ضروری نیست. به همین راحتی می‌توانیم کارگران را از کانال ورودی خارج کنیم. این فقط برای وضوح در اینجا انجام شده است.

سپس تعداد ثابتی از کارگران را به‌عنوان گوروتین ارسال می‌کنیم. هر کارگر از کانال jobs خارج می شود تا زمانی که داده دیگری برای پردازش وجود نداشته باشد و در آن زمان به یک WaitGroup سیگنال دهد که کار انجام شده است.

رشته اصلی از یک WaitGroup استفاده می‌کند تا مطمئن شود تا زمانی که همه کارگران تمام نشده‌اند، یعنی همه کارها پردازش نشده باشند، کامل نمی‌شود.

یک نکته کلیدی قابل ذکر است که این الگو هیچ تضمینی برای ترتیب پردازش توالی ورودی ندارد. این ممکن است در بسیاری از شرایط خوب باشد. به عنوان مثال، توالی ورودی، رکوردهای داده ای هستند که دارای مهر زمانی خود هستند و هدف ذخیره رکوردها در یک دسی بل است. فن اوت در این مورد قابل قبول خواهد بود.

نکته پایانی، پس از ارسال تمام داده‌های موجود در دنباله، نظراتی در مورد بستن کانال‌ها مشاهده خواهید کرد. این مهم است. اپراتور محدوده ای که از کانال ها بیرون می کشد، زمانی که داده دیگری وجود نداشته باشد، به حالت خواب می رود. شما می توانید این را با اظهار نظر یکبار از دستورات ()close که باعث ایجاد یک شرط بن بست می شود، تأیید کنید. گوروتین ها و کانال ها بسیار قدرتمند هستند اما شما باید از آنها عاقلانه استفاده کنید.

چه کاری متفاوت انجام می دهید؟ چگونه می توانیم این مثال را بهبود بخشیم؟ نظرات خود را در زیر بنویسید

با تشکر!

کد این پست و همه پست های این مجموعه را می توانید در اینجا پیدا کنید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا