برنامه نویسی

PHOS: یک پسوند کانال Go با کنترلرهای داخلی

معرفی

کانال ها یکی از ویژگی های ضروری Golang هستند. استفاده ماهرانه از کانال ها می تواند برنامه نویسی همزمان را طبیعی جلوه دهد. این مقاله یک افزونه کانال PHOS بر اساس کانال های بومی Golang را معرفی می کند. PHOS به ما اجازه می دهد تا پردازش خاصی را روی داده های ارسال شده به کانال انجام دهیم. PHOS همچنین دارای گزینه های پیکربندی غنی است که می تواند با توجه به نیازهای مختلف سفارشی شود.

PHOS چیست؟

PHOS یک برنامه افزودنی کانال Golang با کنترل‌کننده‌های داخلی و گزینه‌های متنوع است.

نصب و راه اندازی

توجه: قبل از نصب، مطمئن شوید که نسخه Golang شما از نرم افزارهای عمومی پشتیبانی می کند (Go >= 1.18).

برای نصب PHOS دستور زیر را اجرا کنید:

go get github.com/B1NARY-GR0UP/phos
وارد حالت تمام صفحه شوید

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

شروع سریع

در مثال زیر ابتدا پردازنده داخلی خود را تعریف می کنیم. سپس یک نمونه PHOS ایجاد می‌کنیم، پردازنده را به زنجیره پردازشگر PHOS اضافه می‌کنیم و در نهایت، می‌توانیم نتیجه پردازش شده توسط پردازنده را با ارسال داده‌ها دریافت کنیم و آن را چاپ کنیم. به این معنا که، BINARY += -PHOS => BINARY-PHOS.

package main

import (
    "context"
    "fmt"

    "github.com/B1NARY-GR0UP/phos"
)

func hello(_ context.Context, data string) (string, error) {
    return data + "-PHOS", nil
}

func main() {
    ph := phos.New[string]()
    defer close(ph.In)
    ph.Handlers = append(ph.Handlers, hello)
    ph.In <- "BINARY"
    res := <-ph.Out
    fmt.Println(res.Data)
}
وارد حالت تمام صفحه شوید

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

راهنمای کاربر

درباره خلقت

PHOS بر اساس ژنریک است. هنگام ایجاد یک نمونه از طریق phos.New روش، ما می توانیم ژنریک را برای پردازش داده های یک نوع خاص تنظیم کنیم.

هنگام ایجاد یک نمونه، مانند یک کانال معمولی، نیازی به تعیین اندازه بافر کانال ندارید. شما می توانید فرض کنید که PHOS یک بافر نامحدود دارد.

PHOS همچنین از بسیاری از گزینه های سفارشی پشتیبانی می کند. ما می توانیم این گزینه ها را هنگام ایجاد یک نمونه از طریق اضافه کنیم phos.New. مثلا:

ph := phos.New[string](phos.WithZero(), phos.WithTimeout(time.Second*5))
وارد حالت تمام صفحه شوید

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

گزینه های بیشتر پشتیبانی شده در جداول در فصل های بعدی فهرست می شوند.

درباره ورودی و خروجی

PHOS ورودی و خروجی داده را با استفاده از یک کانال فقط خواندنی و فقط نوشتنی پیاده سازی می کند.

پس از ایجاد یک نمونه از طریق phos.New، می توانید داده ها را با استفاده از کانال فقط نوشتن عمومی به PHOS وارد کنید In. در مثال شروع سریع، ما در یک رشته به In. توجه داشته باشید که نوع داده ارسالی باید با نوع عمومی مورد استفاده در هنگام ایجاد نمونه سازگار باشد. همانطور که قبلاً اشاره کردیم، می توانید بدون تعیین اندازه بافر، داده ها را تقریباً بدون محدودیت وارد PHOS کنید:

  ph.In <- "BINARY"
  ph.In <- "Hello"
  ph.In <- "Foo"
  ...
وارد حالت تمام صفحه شوید

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

ما همچنین می توانیم داده های پردازش شده توسط PHOS را از طریق کانال فقط خواندنی عمومی بخوانیم Out. لازم به ذکر است که مقدار خروجی از Out به صورت یک کپسوله شده است Result نوع:

  • را Data فیلد نتیجه پردازش شده است و نوع آن نیز با نوع عمومی نمونه مطابقت دارد.

  • را OK فیلد با استفاده از متغیر اختیاری دوم سازگار است، زمانی که معمولاً داده‌هایی را از کانال دریافت می‌کنیم، که می‌توان از آن برای تعیین اینکه آیا داده‌ها را می‌توان از کانال خواند استفاده کرد.

نکته: هنگام استفاده از PHOS نباید از مقدار برگشتی دوم کانال Out استفاده کنید بلکه از فیلد OK نتیجه استفاده کنید، زیرا مقدار برگشتی دوم کانال Out همیشه درست خواهد بود و استفاده اشتباه از آن باعث ایجاد باگ می شود.

  • را Err فیلد استثناهایی را که ممکن است در هنگام استفاده از PHOS رخ دهد، از جمله استثناهای مهلت زمانی، استثناهای پردازش پردازنده داخلی را که در متن زیر توضیح داده خواهد شد، درخواست می کند.
   // Result PHOS output result
   type Result[T any] struct {
    Data T
    // Note: You should use the OK of Result rather than the second return value of PHOS Out channel
    OK  bool
    Err *Error
   }
وارد حالت تمام صفحه شوید

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

درباره هندلرهای داخلی

پردازنده های داخلی یکی از مهم ترین ویژگی های PHOS هستند. با تنظیم یک یا چند پردازنده داخلی، PHOS تمام پردازنده های داخلی را برای هر داده ورودی اجرا می کند. به ترتیب، و می توانیم نتیجه پردازش شده توسط پردازنده قبلی را برای پردازش بیشتر از طریق مقادیر برگشتی به پردازنده بعدی منتقل کنیم.

امضای عملکرد پردازنده معتبر به شرح زیر است:

 func(ctx context.Context, data T) (T, error)
وارد حالت تمام صفحه شوید

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

ما می توانیم یک زنجیره پردازنده با PHOS بسازیم Handlers فیلد برش عمومی با اضافه کردن پردازنده های سفارشی خودمان. به عنوان مثال، ما در اینجا یک زنجیره پردازنده با سه پردازنده ساخته ایم. هر پردازنده یک بار عملیات جمع را روی داده های ورودی انجام می دهد و در نهایت هر داده ورودی پس از اضافه شدن سه عدد (+1*3) به ما بازگردانده می شود.

package main

import (
    "context"
    "fmt"

    "github.com/B1NARY-GR0UP/phos"
)

func plusOne(_ context.Context, data int) (int, error) {
    return data + 1, nil
}

func main() {
    ph := phos.New[int]()
    defer close(ph.In)
    ph.Handlers = append(ph.Handlers, plusOne, plusOne, plusOne)
    ph.In <- 1
    ph.In <- 2
    ph.In <- 3
    res1 := <-ph.Out
    res2 := <-ph.Out
    res3 := <-ph.Out
    fmt.Println(res1.Data) // 4
    fmt.Println(res2.Data) // 5
    fmt.Println(res3.Data) // 6
}

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

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

در مورد رسیدگی به خطا

PHOS استثناها را به طور عمده به سه نوع تقسیم و طبقه بندی می کند:

 const (
    _ ErrorType = iota
    TimeoutErr
    HandleErr
    CtxErr
 )
وارد حالت تمام صفحه شوید

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

مکانیسم زمان‌بندی یکی از ویژگی‌های اصلی PHOS است. حداکثر زمان پردازش را برای هر داده در زنجیره پردازنده داخلی مشخص می کند. اگر مهلت زمانی رخ دهد، یک استثنای مهلت زمانی ایجاد می شود. اگر گزینه کنترل کننده استثنای زمانی پیکربندی نشده باشد، داده های اولیه مربوطه خروجی می شود و استثنای مهلت زمانی در کادر نمایش داده می شود. Err زمینه ی Result; اگر کنترل کننده استثنای مهلت زمانی پیکربندی شده باشد، داده های پردازش شده توسط کنترل کننده استثنای مهلت زمانی خروجی داده می شود.

  • استثناء هندلرهای داخلی

اگر یک استثنا در هر یک از هندلرهای داخلی در زنجیره کنترلرهای داخلی رخ دهد، زنجیره پردازشگر خاتمه می یابد. اینکه آیا آخرین داده پردازش شده یا داده های پردازش شده توسط کنترل کننده استثنا برگردانده شود به این بستگی دارد که کنترل کننده استثنای کنترل کننده داخلی پیکربندی شده باشد. به طور مشابه، استثنا در قسمت نمایش داده می شود Err زمینه ی Result.

استثناهای زمینه زمانی رخ می دهند که WithContext گزینه پیکربندی و فعال می شود. در این زمان، پردازش داده‌ها فوراً خاتمه می‌یابد، و اینکه آیا داده‌های اولیه یا داده‌های پردازش شده توسط کنترل‌کننده استثنا برگردانده شود، بستگی به این دارد که آیا ErrDoneFunc پیکربندی شده است. اطلاعات استثنا نیز در قسمت نمایش داده می شود Err زمینه ی Result.

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

پیکربندی

گزینهپیش فرضشرح
WithContextcontext.Background()زمینه را برای PHOS تنظیم کنید
WithZerofalseهنگام وقوع خطا، مقدار صفر را برای بازگشت تنظیم کنید
WithTimeouttime.Second * 3تنظیم زمان برای اجرای کنترل کننده ها
WithErrHandleFuncnilعملکرد دسته خطا را برای PHOS تنظیم کنید که در صورت وقوع خطای دسته، فراخوانی می شود
WithErrTimeoutFuncnilتابع زمان خطا را برای PHOS تنظیم کنید که زمانی که خطای مهلت زمانی رخ داد فراخوانی می شود
WithErrDoneFuncnilتابع err done را برای PHOS تنظیم کنید که پس از انجام متن فراخوانی می شود

خلاصه

موارد فوق مقدمه‌ای بر PHOS است، یک پسوند کانال Golang با کنترل‌کننده‌های داخلی و گزینه‌های متنوع. امید است که بتواند کمک یا ایده هایی برای پیشرفت شما ارائه دهد. در صورت وجود هر گونه اشتباه یا مشکل، لطفاً نظر خود را ارسال کنید یا پیام خصوصی ارسال کنید.

مقاله بعدی در مورد طراحی و پیاده سازی PHOS توضیح خواهد داد. اگر به PHOS علاقه دارید، لطفاً در GitHub به آن ستاره بدهید.

فهرست مرجع

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

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

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

همچنین ببینید
بستن
دکمه بازگشت به بالا