أثناء تطوير LiveApi ، وهي أداة توليد توثيق API للسيارات ، كنت بحاجة إلى تنفيذ آلية قائمة انتظار قوية تم تحجيمها بناءً على عدد مراكز آلة الخادم. كان هذا أمرًا بالغ الأهمية لمنع استخدام الموارد المفرطة (الذاكرة ووحدة المعالجة المركزية) التي يمكن أن تؤدي إلى جوع الموارد ، والتعطل ، وتجربة المستخدم الضعيفة.
في هذه المقالة ، سأشرح كيف استخدمت Mutexes في Golang لمعالجة هذا التحدي.
ما هو mutex؟
في البرمجة المتزامنة ، يعد Mutex (الاستبعاد المتبادل) آلية قفل تمنع ظروف السباق من خلال ضمان أن Goroutine واحد فقط يمكنه الوصول إلى مورد مشترك في وقت واحد. إنه أقرب إلى مفتاح الغرفة - يمكن لشخص واحد فقط الاحتفاظ بالمفتاح والدخول مرة واحدة.
استخدام Mutex في Golang
دعونا نوضح كيف يمكن لـ Mutex إدارة تنفيذ الوظائف المتزامنة:
توفر حزمة Sync Go's العديد من البدائيات للمزامنة ، حيث تكون Mutex واحدة من أكثر الأدوات شيوعًا.
var ( maxConcurrentJobs int activeJobs int jobMutex sync.Mutex )
في هذا الرمز ، يتتبع متغير ActiveJobs عدد الوظائف التي تعمل حاليًا. نظرًا لأن العديد من goroutines قد تحاول تعديل هذا المتغير بشكل متزامن ، مما يؤدي إلى ظروف السباق ، فإننا نستخدم Mutex لمزامنة الوصول.
// Check if we can process more jobs jobMutex.Lock() if activeJobs >= maxConcurrentJobs { jobMutex.Unlock() // Wait before checking again time.Sleep(time.Second) continue } jobMutex.Unlock()
كيف يعمل mutex
Locking : تكتسب طريقة Lock () وصولًا حصريًا إلى القسم الحرج.
unlocking : طريقة Unlock () تطلق القفل.
القسم الحرج : الكود بين القفل وإلغاء القفل حيث يتم الوصول إلى المورد المشترك **.
أنواع mutexes في Golang
sync.mutex : هذا هو قفل الاستبعاد المتبادل الأساسي في GO. إنها تسمح فقط بوتين واحد للوصول إلى القسم الحرج في وقت واحد.
type SafeCounter struct { mu sync.Mutex count int }
sync.rwmutex : هذا قارئ/كاتب يسمح للقراء بالعديد من القراء للوصول إلى المورد المشترك في وقت واحد ، ولكن كاتب واحد فقط في وقت واحد.
var rwMutex sync.RWMutex // Reader methods rwMutex.RLock() // Lock for reading rwMutex.RUnlock() // Unlock for reading // Writer methods rwMutex.Lock() // Lock for writing rwMutex.Unlock() // Unlock for writing
mutexes هي أدوات أساسية لإدارة الموارد المشتركة في برامج GO المتزامنة. أنها تمنع ظروف السباق وضمان سلامة البيانات من خلال التحكم في الوصول إلى الأقسام الحرجة من الكود.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3