برنامه نویسی

بارهای کاری: CPU-محدود و IO- محدود-جامعه Dev

حجم کار چیست؟ و چرا ما در مورد آن صحبت می کنیم؟

آیا می توان درک بهتری از زمان استفاده از همزمانی در GO❤ داشت؟

پاسخ این سؤال بله 😁 و نه فقط برای GO است ، بلکه برای هر فناوری که به موازی سازی و همزمانی می پردازد.

بار کاری به میزان کارهایی که یک برنامه نیاز به انجام دارد اشاره دارد. به عبارت دیگر ، بار کاری مجموعه ای از وظایف یا عملیاتی است که یک برنامه باید برای برآورده کردن نیازهای خود انجام دهد.

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

بارهای کاری همچنین می تواند در چندین دستگاه توزیع شود تا مقیاس پذیری برنامه را افزایش دهد. به عنوان مثال ، اگر یک برنامه دارای بار کاری I/O باشد ، می توان آن را برای بهبود ظرفیت رسیدگی به درخواست کاربر بین چندین سرور توزیع کرد.

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

همزمانی در GO فوق العاده قدرتمند و در عین حال ساده است – این قصد مهندسانی بود که GO را طراحی کردند. بسیاری از مشکلات را می توان با استفاده از همزمانی بسیار کارآمدتر حل کرد و اینجاست که می درخشد. به همین دلیل است که GO به یک خدا تبدیل شده است وقتی صحبت از همزمان با حمایت است.

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

مثال یک کارگر در GO:

هر برنامه GO با تعریف package و وارد کردن کتابخانه های لازم

package main

import "fmt"
import "time"
حالت تمام صفحه را وارد کنید

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

این عملکرد ماست کارگر، که همزمان به عنوان یک اجرا می شود گوروتین در حالی که بقیه کد به اجرای خود ادامه می دهد.

بیایید تجزیه کنیم پارامترها و درک کانال، که مکانیسم عبور ایمن بین مقادیر بین است گودال:

  • jobs <-chan int: این یک است کانال ورودی (فقط دریافت)
  • results chan<- int: این یک است کانال خروجی (ارسال فقط).
  • result2 chan string: این یک است کانال دو طرفه، به این معنی که در داخل عملکرد ، می توانید هر دو ارسال و دریافت می کنند ارزش ها از طریق آن.

عملکرد کارگر در GO

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("worker:", id, "started  job", j)
        time.Sleep(time.Second)
        fmt.Println("worker:", id, "finished job", j)
        results <- j * 8
    }
}
حالت تمام صفحه را وارد کنید

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

در اینجا ، ما برنامه خود را توسط اعلام کانال هابشر

ما چندین راه اندازی می کنیم گودال از کارگر ما بار کار را توزیع کنید کارآمد

در این حالت ، ما تخم ریزی می کنیم سه کارگر همزمانبشر

عملکرد اصلی: کارگران تخم ریزی و توزیع بارهای کاری

func main() {
        jobs := make(chan int, 100)
        results := make(chan int, 100)

        // Launching 3 worker goroutines
        for w := 1; w <= 3; w++ {
                go worker(w, jobs, results)
        }

        // Sending 5 jobs to the workers
        for j := 1; j <= 5; j++ {
                jobs <- j
        }

        close(jobs)

        // Collecting results from the workers
        for a := 1; a <= 5; a++ {
                <-results
        }
}
حالت تمام صفحه را وارد کنید

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

Go برای رسیدگی طراحی شده است همزمانی کارآمد و ایمن

همزمانی از طریق حاصل می شود گودال، که قطعات کوچکی از کد هستند که می توانند به طور همزمان اجرا شوند اما لزوماً به صورت موازی نیستند.

گوروتین ها هستند سبک وزن از نظر منابع، به این معنی که هزاران نفر از آنها را می توان در یک برنامه واحد و بدون عملکرد تخریب کننده ایجاد کرد.

برو زمان اجرا تصمیم می گیرد که آیا گوروتین بسته به در دسترس بودن منابع و تعداد هسته های فیزیکی موجود ، به طور همزمان یا به طور موازی در هسته های CPU اجرا می شود.

برقراری ارتباط بین goroutines

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

همزمان در بسته GO's NET/HTTP

در net/http کارهای بسته بندی همزمان، مقیاس بندی درخواست ها و توزیع منابع محاسباتی به طور مؤثر.

اگر علاقه مند به معیارهای این موضوع و مقایسه با زبان های مختلف برنامه نویسی هستید ، این لینک را بررسی کنید:

👉 معیار.

در اینجا ، شما می توانید قدرت را ببینید net/http هنگامی که توسط سریع چارچوب (سریع) ، توسعه یافته در GO ، که از آن استفاده می کند net/httpبشر

همچنین در برابر مقایسه شده است اکسیر، یک زبان برنامه نویسی کاربردی و همزمان.

اکسیر در مقابل سریع

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

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

بوها نخ می تواند دو نوع بار کار را تحمل کند (بارهای کاری):

CPU محدود

I/O محدود

CPU محدود

این نوع بار کاری هرگز قرار نمی دهد نخ به حالت انتظاربشر

این محاسبات دائماً انجام می شود. محاسبات موضوع پيشگاه به عنوان مثال ، به قدرت هجدهم خواهد بود CPU محدود شدهبشر

(واقعیت سرگرم کننده: اما هاروکا ایوائو یک دانشمند رایانه ژاپنی و مهندس توسعه دهنده ابر در Google است. در سال 2019 ، او دقیق ترین مقدار PI را که تاکنون ثبت شده است ، محاسبه کرد و به 31.4 تریلیون رقم رسید.)

برای CPU محدود بارهای کاری ، موازی سازی برای به حداکثر رساندن اجرای همزمان مورد نیاز است. با این حال ، به سادگی افزایش تعداد گودال کمکی نخواهد کرد و حتی ممکن است عملکرد را تخریب کند.

این به خاطر هزینه تاخیر (زمان صرف شده) در جابجایی گوروتین ها در داخل و خارج از موضوع سیستم عامل


I/O محدود

در این نوع بار کار ، موضوعات وارد حالت های انتظار می شوندبشر

یک مثال خوب است درخواست های شبکه یا تماس های سیستمبشر

موضوعی که نیاز دارد:

  • دسترسی به a مجموعه پایگاه داده
  • اجرا کردن وقایع هماهنگ سازی (مثله ، اتمی)
  • برقراری ارتباط از طریق شبکه

… باید انتظار داشتن، ساختن آن I/O محدود بار کار

برای این نوع بار کار ، موازی بودن لازم نیست برای دستیابی به همزمانی – یک تک هسته فیزیکی اغلب برای رسیدگی به کارآمد کافی است چند گوروتینبشر

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

داشتن بیشتر goroutines از هسته های فیزیکی می تواند سرعت بخشیدن از آنجا نه ایجاد یک تنگنا اضافی.

در عوض ، کار به طور طبیعی قطع می شود، اجازه دیگری گوروتین برای استفاده از همان هسته فیزیکی به جای اینکه اجازه دهید بیکار بماند.


پایان

در رفتن زبان برنامه نویسی ارائه می دهد قدرتمند وت آسان ابزاری برای رسیدگی همزمانی، آن را به یک انتخاب عالی برای با کارایی بالا و مقیاس پذیر برنامه ها

درک چه زمانی از موازی سازی در چندین هسته فیزیکی استفاده کنیم در مقابل هنگامی که همزمانی ساده در هسته های کمتری (یا یک هسته واحد) کافی است ضروری است

Go ارائه های مختلفی را ارائه می دهد الگوهای به تعادل این بارهای کاری و در برخی موارد ممکن است به ترکیبی از آن نیاز داشته باشید هر دو رویکردبشر

آیا می خواهید در این موضوع عمیق تر شیرجه بزنید؟ این پست را بررسی کنید:

👉 پیچیدگی ساده: آغاز

امیدوارم دوست داشته باشی !! 🚀😃

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

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

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

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