Ruby / التكامل: البيانات والموارد وأدلة التنفيذ والثقة / الدرس 16
اختيار التزامن بملكية واضحة للحالة والعمر
ميّز الخيوط والقيود المحمية بالأقفال و Fibers التعاونية وحدود Ractor المرتبطة بالنسخة دون ادعاءات تواز عامة.
في هذه الصفحة
أهداف الدرس
- احم انتقال الحالة المشترك كاملا ولا تفترض أن قفل المفسر يجعل التطبيق ذريّا.
- عيّن مالكا للإتمام والأخطاء والإلغاء وكل أداة تزامن.
تحل أدوات التزامن مشكلات مختلفة
قد تشترك الخيوط في كائنات قابلة للتعديل، وتوفر Fibers تعليقا تعاونيا، وتفرض Ractors قيود مشاركة ورسائل. ليست أغلفة متبادلة للكتلة. يؤثر المحرك والمكتبات الأصلية في التوازي وإتاحة I/O لتنفيذ آخر. لا تعد بتسريع الحساب لمجرد إنشاء خيوط. تعتمد الدورة وثائق 3.3 ولا تدعي تطابق CRuby و JRuby و TruffleRuby. حدّد الحمل والحالة والعمر قبل الاستراتيجية.
يحتاج التحديث المركب بروتوكول حماية متماسكا
تقرأ زيادة العداد وتحسب وتكتب من حيث المفهوم. لا يثبت قفل داخلي معاملة عمل عبر عمليات Ruby أو استدعاءات خارجية. ينسق Mutex الجزء الحرج إذا التزم كل وصول منافس بالبروتوكول. احم حقول القيد معا؛ فقد تكشف الأقفال المنفصلة أو العمليات الآمنة منفردة حالة مركبة خاطئة. ركّز الجزء وتجنب انتظار الخارج غير اللازم. لا ينسق القفل المحلي عملية أخرى أو يحمي صف قاعدة مرجعيا بذاته.
انتظر العمال قبل قراءة النتيجة النهائية
يبدأ البرنامج خيطين صغيرين بزيادتين محميتين لكل منهما. تضع join القراءة النهائية بعد إتمامهما، فيتوقع النموذج أربعة. الحساب توضيحي صغير بلا توليد حمل أو خدمة. تحتاج أخطاء العمال مراقبة وسياسة؛ وليس التخلي عنها عند انتهاء العمر الرئيسي معالجة خلفية موثوقة. لم يتوفر المفسر، فلم تختبر الجدولة أو واجهة القفل. تتبع القيمة البروتوكول الموثق لا تجربة سباق أو أداء.
mutex = Thread::Mutex.new
count = 0
workers = 2.times.map do
Thread.new do
2.times { mutex.synchronize { count += 1 } }
end
end
workers.each(&:join)
puts count
4
المخرج المتوقع 4 وفق البروتوكول. تشترك الكتابات في القفل وتلي القراءة الانتظار. لم يُنفذ أو يقس أو يستخدم اختبار حمل.
تستأنف Fiber وفق بروتوكول تعاوني
لا يبدأ إنشاء Fiber تشغيلها فورا. تعمل resume حتى yield أو الإتمام وتكمل التالية من التعليق. ليست Fiber متوازية أو I/O غير حاجبة تلقائيا. قد يغير تكامل المجدول تعاون العمليات المدعومة بحسب الإعداد والواجهة. يستخدم المثال resume و yield صريحتين بنصوص ثابتة لترتيب واضح، دون مورد يمتد عبر التعليق. يحتاج I/O الحقيقي إلغاء وفشلا وتنظيفا مملوكا، لا افتراض أن التعاون يحسم العمر.
fiber = Fiber.new do
Fiber.yield 'first'
'last'
end
puts fiber.resume
puts fiber.resume
puts fiber.alive?
first
last
false
المخرج المتوقع first ثم last ثم false. تكمل resume الثانية Fiber. لم يُنفذ مجدول أو I/O غير متزامنة أو اختبار Ruby.
عامل العزل والنقل كعقود تخص النسخة
تتضمن Ractor في سياق 3.3 المختار جوانب تجريبية وتقيّد المشاركة والنقل. لا تمنح إذنا لتمرير أي كائن يملك موردا إلى تواز. تختلف آثار قابلية المشاركة والنسخ والنقل والتجميد التكراري على المراجع القائمة. صغّر الرسائل وحدّد هوية الطلب والنتيجة وإيقاف العامل والمتأخر. افحص المحرك والمكتبات الفعلية قبل التبني. لا تشغل الدورة Ractor أو خيطا أو مجدول Fiber أو ضغط تزامن أو إنتاجية، ولا تضمن تزامن الإنتاج.
الأخطاء الشائعة وإصلاحها
يفقد عداد مشترك تحديثات رغم افتراضات المفسر.
- لماذا يحدث؟
- افتقر انتقال التطبيق لبروتوكول مزامنة كامل.
- كيف تصلحه؟
- احم القيد وكل وصول بمالك أو مزامنة مناسبين.
- كيف تتجنب تكراره؟
- حلّل المركب ولا تعتمد أقوالا عامة عن المحرك.
يُتوقع عمل Fiber قبل resume.
- لماذا يحدث؟
- اختلط التنفيذ التعاوني ببدء خيط تلقائي.
- كيف تصلحه؟
- استخدم بروتوكول resume/yield أو المجدول المعلن.
- كيف تتجنب تكراره؟
- وثّق من يقود Fiber وينهيها.
يُعامل Mutex محلي كحماية مخزون بين العمليات.
- لماذا يحدث؟
- اختلط تنسيق الذاكرة بالتخزين المشترك المرجعي.
- كيف تصلحه؟
- افرض القيد الحقيقي عند حد دوامه المرجعي.
- كيف تتجنب تكراره؟
- اذكر نطاق كل آلية تزامن بدقة.
اختبر فهمك
1. هل يثبت نجاح عداد بلا مزامنة مرة صحته؟
اعرض الحل المشروح
لا. يعتمد السباق على الجدولة وقد يغيب في التشغيل. أثبت حجة مزامنة لكل وصول وافحص حالات معزولة ممثلة. يكشف الاختبار عيبا ولا يجعل المركب غير المحمي ذريّا. سجّل المحرك والبيئة ولا تعمم نتيجة محظوظة.
2. لماذا يظل العامل الخلفي محتاجا مالكا بعد توقف المستدعي عن الانتظار؟
اعرض الحل المشروح
تحتاج نتيجته واستثناءه وموارده وآثاره وجهة وتنظيفا محددين. قرّر الحفظ أو الإلغاء التعاوني أو المطابقة. لا تثبت المهلة أو إهمال المرجع توقف الحساب أو عدم إتمام الخارج. حد الحالة المعلقة واحفظ هوية الطلب عند الحاجة.
أهم ما تعلمته
- يغير التزامن التزامات الملكية والفشل إلى جانب الجدولة.
- لا يتحول سلوك محرك معين إلى ادعاء تواز عام.