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
.
هنگامی که گزینه مقدار صفر فعال است، هر زمان که هر یک از استثناهای بالا رخ دهد، مقدار صفر از نوع داده مربوطه برگردانده می شود. این کار نتایج پردازش دادههای کنترلکننده استثنای مهلت زمانی پیکربندی شده و کنترلکننده استثنای پردازنده داخلی را بازنویسی میکند.
پیکربندی
گزینه | پیش فرض | شرح |
---|---|---|
WithContext | context.Background() | زمینه را برای PHOS تنظیم کنید |
WithZero | false | هنگام وقوع خطا، مقدار صفر را برای بازگشت تنظیم کنید |
WithTimeout | time.Second * 3 | تنظیم زمان برای اجرای کنترل کننده ها |
WithErrHandleFunc | nil | عملکرد دسته خطا را برای PHOS تنظیم کنید که در صورت وقوع خطای دسته، فراخوانی می شود |
WithErrTimeoutFunc | nil | تابع زمان خطا را برای PHOS تنظیم کنید که زمانی که خطای مهلت زمانی رخ داد فراخوانی می شود |
WithErrDoneFunc | nil | تابع err done را برای PHOS تنظیم کنید که پس از انجام متن فراخوانی می شود |
خلاصه
موارد فوق مقدمهای بر PHOS است، یک پسوند کانال Golang با کنترلکنندههای داخلی و گزینههای متنوع. امید است که بتواند کمک یا ایده هایی برای پیشرفت شما ارائه دهد. در صورت وجود هر گونه اشتباه یا مشکل، لطفاً نظر خود را ارسال کنید یا پیام خصوصی ارسال کنید.
مقاله بعدی در مورد طراحی و پیاده سازی PHOS توضیح خواهد داد. اگر به PHOS علاقه دارید، لطفاً در GitHub به آن ستاره بدهید.
فهرست مرجع