Gopher Academy
3.34K subscribers
920 photos
40 videos
280 files
2.01K links
🕸 Gopher Academy

🔷interview golang
https://github.com/mrbardia72/Go-Interview-Questions-And-Answers

حمایت مالی:
https://www.coffeete.ir/mrbardia72

ادمین:
@mrbardia72
Download Telegram
Forwarded from Gopher Academy
🎯وقتی شما یه کانال از نوع بافر شده میسازید دقیقا پشته صحنه این اتقاقات بالا می افته🎯
🔺هربخش رو توی ادامه توضیح میدم
🔹ch := make(chan int, 3)
.
🔰 @gopher_academy
Gopher Academy
🎯آموزش سفر به اعماق channel ها در گولنگ🎯 🔹Channel? 🔹What it takes to be a Channel. 🔹Channel Structure 🔹hchan and waitq structs 🔹Important Field of sudog struct for channel 🔹Chan Struct at the runtime 🔹Recvq structure 🔹Send Opertaion Steps c <- x 🔸sending…
🎯hchan and waitq structs🎯
🎯وقتی شما یه کانال به صورت زیر تعریف می کنید (به عنوان مثال)دقیقا پشته صحنه ساختاری به نام hchan ایجاد میشه براش(ساختار بالا)🎯
🔹ch := make(chan int, 2)

🔰 @gopher_academy
🎯ما برای تکمیل تیم برنامه نیاز به برنامه نویس بک اند گولنگ داریم در صورتی که واجد شرایط زیر هستید از طریق ایمیلebrahimiteam@gmail.com با ما در ارتباط باشید.
🎯برنامه نویس زبان گولنگ( Backend Golang developer)


Middle Golang Developer
الزامات:
🔹6+ ماه تجربه با Golang ،
🔹مبانی قوی علوم کامپیوتر: ساختار داده ها ، الگوریتم ها ، همزمانی و موازی سازی.
🔹دانش اولیه در مورد چگونگی نوشتن آزمونهای واحدی ؛
🔹تجربه خوبی با PostgreSQL.
🔹گیت
🔹ویندوز ، لینوکس یک امتیاز مثبت خواهد بود.
🔹انگلیسی متوسط.

یک امتیاز مثبت خواهد بود:
🔹داکر ، کوبرنتس ؛
🔹جین ، معماری تمیز ؛
🔹دانش استانداردهای JSON / XML ؛
🔹درک اصول REST.

مسئولیت ها:
🔹توسعه و پشتیبانی از یک یا چند سرویس سیستم عامل ؛
🔹نوشتن کد کارآمد ، خواندنی و قابل استفاده مجدد ؛
🔹رفع اشکالات.
https://dewzilla.com

🔰 @gopher_academy
Gopher Academy
🎯hchan and waitq structs🎯 🎯وقتی شما یه کانال به صورت زیر تعریف می کنید (به عنوان مثال)دقیقا پشته صحنه ساختاری به نام hchan ایجاد میشه براش(ساختار بالا)🎯 🔹ch := make(chan int, 2) 🔰 @gopher_academy
🎯توضیحاتی درباره فیلد های این ساختار🎯
🔹qcount
کل دادهای که در صف قرار دارند
🔹dataqsize
اندازه بافر رو مشخص می کند make(chan T, N)
🔹elemsize
اندازه کانال مربوط به یک عنصر است.
🔹buf
یک نوع مدل صف دایره ای است که داده های ما در آن ذخیره می شود. (فقط برای کانال بافر استفاده می شود)
🔹closed
وضعیت بسته بودن یا باز بودن کانال فعلی رو نشون میده اگر صفر باشد یعنی باز و اگر یک باشد یعنی بسته هست کانال ما
🔹sendx and recvx
فیلد حالت بافر به صورت حلقه ای است ، یعنی شاخص فعلی بافر را نشان می دهد که از آنجا می تواند داده ارسال کند و داده دریافت کند.()
🔹recvq and sendq
صف های انتظار recvq و sendq ، که برای ذخیره goroutines مسدود شده هنگام تلاش برای خواندن داده ها در کانال یا هنگام ارسال داده ها از کانال استفاده می شود.
🔹lock
برای قفل کردن کانال برای هر یک از عملیات خواندن و نوشتن ، ارسال و دریافت که این عملیات کاملاً متفاوتی باشد.
https://golang.org/src/runtime/chan.go

🔰 @gopher_academy
Gopher Academy
🎯Important Field of sudog struct for channel🎯 شمای یک گورتین را می دهد sudog represent the goroutine. 🔰 @gopher_academy
خوب توی این کد میخوایم بررسی کنیم که خط شماره ۲۲ چه روندی روی توی ساختار برامون ایجاد می کند(بررسی این خط کد روی ساختار)
👇🏻👇🏻👇🏻👇🏻👇🏻

🔰 @gopher_academy
🎯Chan Struct at the runtime🎯
این نما رو برای کد بالا درنشر بگیرید
توضیحات در زیر این پست
👇🏻👇🏻👇🏻👇🏻👇🏻

🔰 @gopher_academy
Gopher Academy
🎯Chan Struct at the runtime🎯 این نما رو برای کد بالا درنشر بگیرید توضیحات در زیر این پست 👇🏻👇🏻👇🏻👇🏻👇🏻 🔰 @gopher_academy
👆🏻توضیحات این شمای و کدهای بالاش👆🏻

به خط هاب شماره 47 و 48 بالا توجه کنید. در شکل بالا
به یاد داشته باشید توضیحات recvq از بالا برای ذخیره گورتین های مسدود شده ای که سعی در خواندن داده ها از کانال دارند استفاده می شود.

در کد مثال ما قبل از خط 22 دو goroutine (goroutineA و goroutineB) وجود دارد که سعی می کنند داده ها را از کانال ch بخوانند
از آنجا که قبل از خط 22 روی کانال ، هیچ داده ای در کانال قرار نداده ایم ، بنابراین هر دو goroutine مسدود شده برای عملیات دریافت هستند و در داخل ساختار sudog و در recvq وجود خواهند داشت مشخصاتشان.

🔰 @gopher_academy
Gopher Academy
🎯آموزش سفر به اعماق channel ها در گولنگ🎯 🔹Channel? 🔹What it takes to be a Channel. 🔹Channel Structure 🔹hchan and waitq structs 🔹Important Field of sudog struct for channel 🔹Chan Struct at the runtime 🔹Recvq structure 🔹Send Opertaion Steps c <- x 🔸sending…
🎯Send Opertaion Steps c <- x🎯
🔹انواع اصلی عملیات ارسال در کانال
🔸sending on nil channel
🔸sending on the closed channel.
🔸A goroutine is blocked on the channel
🔸Buffered Channel if there is currently space available for hchan.buf
🔸The hchan.buf is full

🔰 @gopher_academy
Gopher Academy
🎯Send Opertaion Steps c <- x🎯 🔹انواع اصلی عملیات ارسال در کانال 🔸sending on nil channel 🔸sending on the closed channel. 🔸A goroutine is blocked on the channel 🔸Buffered Channel if there is currently space available for hchan.buf 🔸The hchan.buf is full
🎯A goroutine is blocked on the channel🎯
اینجاست که ساختار recvq نقش مهمی را ایفا می کند.

اگر در recvq گوروتین وجود داشته باشد ، گیرنده منتظر است و عملیات نوشتن برای کانال را می تواند مستقیماً به آن گیرنده منتقل کند.

👇🏻پیاده سازی عملکرد ارسال در شکل زیر👇🏻

🔰 @gopher_academy
به خط 396 goready (gp، skip + 1) توجه کنید که Goroutine مسدود شده است در حالی که منتظر اطلاعات هست و با تماس با goready دوباره قابل اجرا شده است و برنامه ریز go مجدداً goroutine را اجرا می کند.

🔰 @gopher_academy
Gopher Academy
🎯Send Opertaion Steps c <- x🎯 🔹انواع اصلی عملیات ارسال در کانال 🔸sending on nil channel 🔸sending on the closed channel. 🔸A goroutine is blocked on the channel 🔸Buffered Channel if there is currently space available for hchan.buf 🔸The hchan.buf is full
🎯Buffered Channel if there is currently space available for hchan.buf🎯
🔹اگر در حال حاضر فضای خالی در hchan.buf دسترس باشد: داده ها را در بافر خود قرار می دهد.
در واقع کار تابع chanbuf (c، i) به منطقه ای از حافظه دسترسی پیدا می کند که قرار هست داده های را ارسال کتد
در این کد با مقایسه qcount و dataqsiz مشخص می کند که آیا hchan.buf فضای خالی دارد.
اگر داشت عنصر را کپی می کند و در بافر قرار می دهد و برای ارسال sendx و qcount را تنظیم می کند.

🔰 @gopher_academy
Gopher Academy
🎯Send Opertaion Steps c <- x🎯 🔹انواع اصلی عملیات ارسال در کانال 🔸sending on nil channel 🔸sending on the closed channel. 🔸A goroutine is blocked on the channel 🔸Buffered Channel if there is currently space available for hchan.buf 🔸The hchan.buf is full
🎯The hchan.buf is full🎯
🔹این متد acquisSudog برای قرار دادن goroutine فعلی در حالت park می باشد و سپس goroutine را در sendq کانال می فرستدد.
اشارگره ep داده ها را از باقر می خواند و در تابع Enqueue میفرستد.
یعنی بافر ما خالی نیست و دادهای برای ارسال از این مکانیزم استفاده می کتتد

🔰 @gopher_academy
Gopher Academy
🎯آموزش سفر به اعماق channel ها در گولنگ🎯 🔹Channel? 🔹What it takes to be a Channel. 🔹Channel Structure 🔹hchan and waitq structs 🔹Important Field of sudog struct for channel 🔹Chan Struct at the runtime 🔹Recvq structure 🔹Send Opertaion Steps c <- x 🔸sending…
🎯Send operation Summary🎯
🔹خلاصه روند ارسال در کانال ها

🔸کل ساختار کانال lock در گام اول.

🔸در واقعه این recvq داده ای را از صف مورد انتظار می گیرد و سپس داده را مستقیماً به goroutine می دهد.

🔸اگر recvq خالی است ، بررسی می کند که آیا بافر موجود است یا خیر. در صورت موجود بودن ، *کپی می کند داده ها را از goroutine فعلی به بافر وارد می کند. در واقع - memmove () برای کپی کردن یک بلوک حافظه از یک مکان به مکان دیگر استفاده می شود.

🔸اگر بافر پر باشد ، عنصری که باید نوشته شود در ساختار goroutine در حال اجرا ذخیره می شود و goroutine فعلی از زمان اجرا در sendq مسدود و به حالت تعلیق در می آید.

🔰 @gopher_academy
🎯اگر بافر پر باشد ، عنصری که باید نوشته شود ، در ساختار گوروتین در حال اجرا ذخیره می شود.🎯
🔹درک بهتری از شماره چهار از خلاصه روند ارسال در کانال ها
دوباره بخوانید شماره چهار رو ، به همین دلیل است که کانال غیر بافر در واقع "unbuffered" نامیده می شود حتی اگر ساختار "hchan" دارای عنصر "buf" باشد. 🔹اگر برای یک کانال غیر بافر گیرنده ای وجود نداشته باشد و بخواهید داده ارسال کنید ، داده ها در elem ساختار sudog ذخیره می شوند. (برای کانال بافر نیز صدق می کند).
بگذارید مثالی بزنم تا جزئیات بیشتر نکته شماره 4 را روشن کنید. فرض کنید کد زیر را داریم.👇🏻👇🏻👇🏻👇🏻

🔰 @gopher_academy
🎯ساختار زمان اجرای chan c2 در خط شماره 10 چگونه خواهد بود؟🎯

🔰 @gopher_academy