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
🔹انواع اصلی عملیات ارسال در کانال
🔸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 ➖➖➖➖➖➖➖➖➖…
🎯sending on nil channel🎯
اگر ما از کانال nil در حال ارسال هستیم ، goroutine فعلی عملکرد خود را متوقف می کند.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
اگر ما از کانال nil در حال ارسال هستیم ، 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 ➖➖➖➖➖➖➖➖➖…
🎯sending on the closed channel.🎯
اگر بخواهیم داده ها را روی کانال بسته ارسال کنیم
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
اگر بخواهیم داده ها را روی کانال بسته ارسال کنیم
➖➖➖➖➖➖➖➖➖
🔰 @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
اینجاست که ساختار recvq نقش مهمی را ایفا می کند.
اگر در recvq گوروتین وجود داشته باشد ، گیرنده منتظر است و عملیات نوشتن برای کانال را می تواند مستقیماً به آن گیرنده منتقل کند.
👇🏻پیاده سازی عملکرد ارسال در شکل زیر👇🏻
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
به خط 396 goready (gp، skip + 1) توجه کنید که Goroutine مسدود شده است در حالی که منتظر اطلاعات هست و با تماس با goready دوباره قابل اجرا شده است و برنامه ریز go مجدداً goroutine را اجرا می کند.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
➖➖➖➖➖➖➖➖➖
🔰 @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
🔹اگر در حال حاضر فضای خالی در 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
🔹این متد 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
🔹خلاصه روند ارسال در کانال ها
🔸کل ساختار کانال lock در گام اول.
🔸در واقعه این recvq داده ای را از صف مورد انتظار می گیرد و سپس داده را مستقیماً به goroutine می دهد.
🔸اگر recvq خالی است ، بررسی می کند که آیا بافر موجود است یا خیر. در صورت موجود بودن ، *کپی می کند داده ها را از goroutine فعلی به بافر وارد می کند. در واقع - memmove () برای کپی کردن یک بلوک حافظه از یک مکان به مکان دیگر استفاده می شود.
🔸اگر بافر پر باشد ، عنصری که باید نوشته شود در ساختار goroutine در حال اجرا ذخیره می شود و goroutine فعلی از زمان اجرا در sendq مسدود و به حالت تعلیق در می آید.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯اگر بافر پر باشد ، عنصری که باید نوشته شود ، در ساختار گوروتین در حال اجرا ذخیره می شود.🎯
🔹درک بهتری از شماره چهار از خلاصه روند ارسال در کانال ها
دوباره بخوانید شماره چهار رو ، به همین دلیل است که کانال غیر بافر در واقع "unbuffered" نامیده می شود حتی اگر ساختار "hchan" دارای عنصر "buf" باشد. 🔹اگر برای یک کانال غیر بافر گیرنده ای وجود نداشته باشد و بخواهید داده ارسال کنید ، داده ها در elem ساختار sudog ذخیره می شوند. (برای کانال بافر نیز صدق می کند).
بگذارید مثالی بزنم تا جزئیات بیشتر نکته شماره 4 را روشن کنید. فرض کنید کد زیر را داریم.👇🏻👇🏻👇🏻👇🏻
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔹درک بهتری از شماره چهار از خلاصه روند ارسال در کانال ها
دوباره بخوانید شماره چهار رو ، به همین دلیل است که کانال غیر بافر در واقع "unbuffered" نامیده می شود حتی اگر ساختار "hchan" دارای عنصر "buf" باشد. 🔹اگر برای یک کانال غیر بافر گیرنده ای وجود نداشته باشد و بخواهید داده ارسال کنید ، داده ها در elem ساختار sudog ذخیره می شوند. (برای کانال بافر نیز صدق می کند).
بگذارید مثالی بزنم تا جزئیات بیشتر نکته شماره 4 را روشن کنید. فرض کنید کد زیر را داریم.👇🏻👇🏻👇🏻👇🏻
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🎯ساختار زمان اجرای chan c2 در خط شماره 10 چگونه خواهد بود؟🎯 ➖➖➖➖➖➖➖➖➖ 🔰 @gopher_academy
🔹از آنجا که goroutineA سعی داشت مقدار را به کانال c2 ارسال کند و هیچ گیرنده ای آماده وجود ندارد ، بنابراین goroutineA به لیست sendq کانال c2 اضافه می شود و با مسدود شدن اصطلاحا پارک می شود. بعدش برای تأیید می تواند ساختار زمان اجرای sendq مسدود کننده را بررسی کنیم.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯به یاد داشته باشید تمام انتقال مقادیر کانال ها در حال انتقال با کپی مقدار اتفاق می افتد.🎯
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯خروجی کد فوق🎯
&{Ankur 25}
modifyUser Received Value &{Ankur Anand 100}
printUser goRoutine called &{Ankur 25}
&{Anand 100}
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
&{Ankur 25}
modifyUser Received Value &{Ankur Anand 100}
printUser goRoutine called &{Ankur 25}
&{Anand 100}
➖➖➖➖➖➖➖➖➖
🔰 @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…
🎯قسمت پایانی از این سری فردا🎯
🔷Receive Opertaion Steps <- ch
🔸select channel Example
🔸scase structure
🔸poll order
🔸park goroutine in select case
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔷Receive Opertaion Steps <- ch
🔸select channel Example
🔸scase structure
🔸poll order
🔸park goroutine in select case
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🎯قسمت پایانی از این سری فردا🎯 🔷Receive Opertaion Steps <- ch 🔸select channel Example 🔸scase structure 🔸poll order 🔸park goroutine in select case ➖➖➖➖➖➖➖➖➖ 🔰 @gopher_academy
🎯scase structure🎯
هر scase در آرایه scases یک ساختار است که شامل نوع عملکرد فعلی کانال می باشد که روی آن کار می کند. منظور از عملگرد همان حالت قفل بودن یا نبود کانال می باشد
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
هر scase در آرایه scases یک ساختار است که شامل نوع عملکرد فعلی کانال می باشد که روی آن کار می کند. منظور از عملگرد همان حالت قفل بودن یا نبود کانال می باشد
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯poll order🎯
این یه روش نظرسنجی مانند هست که چک کند وضعیت هر کانال را که کدام الان آماده برای ارسال داده می باشد یعنی بافر خالی الان دارد که بتوان داده ای در آن کانال ارسال کرد
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
این یه روش نظرسنجی مانند هست که چک کند وضعیت هر کانال را که کدام الان آماده برای ارسال داده می باشد یعنی بافر خالی الان دارد که بتوان داده ای در آن کانال ارسال کرد
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
🎯قسمت پایانی از این سری فردا🎯 🔷Receive Opertaion Steps <- ch 🔸select channel Example 🔸scase structure 🔸poll order 🔸park goroutine in select case ➖➖➖➖➖➖➖➖➖ 🔰 @gopher_academy
🎯park goroutine in select case🎯
توی ااین شبه کد اگر هیج داده ای روی کانال نباشد وضعیت گورتین به حالت انتظار برای دریافت می رود
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
توی ااین شبه کد اگر هیج داده ای روی کانال نباشد وضعیت گورتین به حالت انتظار برای دریافت می رود
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯🎯🎯ابن قسمت از سری آموزش سفر به اعماق channel ها در گولنگ به پابان رسید 🎯🎯🎯
👉🏻 https://t.me/gopher_academy/276
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
👉🏻 https://t.me/gopher_academy/276
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy