Ractors
التوازي الحقيقي
Ractors درس مجاني في Ruby Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Ruby Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Ruby Academy 4 دروس في المجموع.
ما هو Ractor؟
إن Ractor (ممثل Ruby) بدائية تزامن أُضيفت في Ruby 3 وتوفر توازيًا حقيقيًا. يشغّل كل Ractor تعليمات Ruby البرمجية بصورة مستقلة، لذا يمكن لـ Ractorين استخدام نواتين لوحدة المعالجة المركزية في الوقت نفسه.
- لا تتشارك Ractors الكائنات القابلة للتغيير، مما يتجاوز قيد GVL.
- تتواصل عبر إرسال الرسائل.
لا تزال Ractors تجريبية، لذلك تطبع Ruby تحذيرًا عند استخدامها.
إنشاء Ractor
أنشئ Ractor باستخدام Ractor.new وكتلة. وتعمل الكتلة بالتوازي. استخدم take للحصول على القيمة النهائية للكتلة.
r = Ractor.new do
2 + 3
end
puts r.takeلا توجد حالة مشتركة
القاعدة الأساسية: لا يمكن لـ Ractors مشاركة الكائنات القابلة للتغيير بحرية. ولا تلتقط كتلة Ractor المتغيرات المحلية الخارجية بالطريقة التي تلتقطها بها الكتلة العادية. يجب تمرير البيانات إليها صراحةً.
هذا العزل هو ما يجعل التنفيذ المتوازي آمنًا من دون أقفال.
تمرير الوسائط إلى الداخل
تُمرَّر الوسائط إلى Ractor.new إلى معاملات الكتلة. وهذه هي الطريقة الآمنة لإرسال البيانات إلى Ractor.
r = Ractor.new(10) do |x|
x * x
end
puts r.takeإرسال الرسائل
تحتوي Ractors على صندوق وارد للرسائل. أرسل باستخدام ractor.send(value) واستقبل داخل الكتلة باستخدام Ractor.receive.
r = Ractor.new do
msg = Ractor.receive
"got: " + msg
end
r.send("hello")
puts r.takeالدفع مقابل السحب
اتجاهان للتواصل:
- الدفع: استخدم
sendإلى Ractor، واقرأ باستخدامRactor.receive. - السحب: يعيد Ractor قيمة باستخدام
Ractor.yield، وتقرأها من الخارج باستخدامtake.
يتيح ذلك معًا لـ Ractors تشكيل مسارات معالجة.
r = Ractor.new do
Ractor.yield 1
Ractor.yield 2
end
puts r.take
puts r.takeالكائنات المجمدة والقابلة للمشاركة
يمكن مشاركة بعض الكائنات بين Ractors لأنها لا يمكن تغييرها: true وfalse وnil والأرقام والرموز والكائنات المجمدة بعمق.
يجمّد Ractor.make_shareable رسمًا بيانيًا للكائنات بحيث يمكن مشاركته بأمان.
data = Ractor.make_shareable([1, 2, 3])
puts "Frozen? " + data.frozen?.to_sالنسخ مقابل النقل
عند إرسال كائن غير قابل للمشاركة، يقوم Ractor افتراضيًا بنسخه نسخًا عميقًا بحيث تكون لدى كل جهة نسختها الخاصة. ويمكنك بدلًا من ذلك نقله باستخدام send(obj, move: true)، ما ينقل الملكية ويجعل الكائن الأصلي غير قابل للاستخدام.
يتجنب النقل تكلفة النسخ للكائنات الكبيرة.
العمل المتوازي
قسّم العمل الذي يستهلك قدرًا كبيرًا من وحدة المعالجة المركزية بين Ractors، ثم اجمع النتائج. وبما أن كل Ractor يعمل بشكل مستقل، يمكن لهذا الأسلوب استخدام عدة أنوية.
ractors = (1..3).map do |n|
Ractor.new(n) do |x|
x * 100
end
end
results = ractors.map(&:take)
puts "Results: " + results.join(", ")مقارنة Ractors بالخيوط
مقارنة:
- تتشارك الخيوط الذاكرة وتحتاج إلى أقفال، بينما تكون Ractors معزولة وتتطلب تبادل الرسائل.
- لا تتيح الخيوط تنفيذ عمل Ruby الحسابي بالتوازي، بينما تتيح Ractors ذلك.
- تفرض Ractors قواعد أكثر صرامة، ما يمنع العديد من أخطاء التزامن.
المقابل لذلك هو أن قواعد مشاركة البيانات تصبح أكثر تقييدًا.
متى تستخدم Ractors
اختر Ractors عندما:
- لديك عمل يعتمد على وحدة المعالجة المركزية وتريد استخدام عدة أنوية ضمن عملية واحدة.
- تريد العزل لتجنب أخطاء الحالة المشتركة.
تذكّر أنها تجريبية؛ فقد تتغير واجهات برمجة التطبيقات، كما أن العديد من gems ليست متوافقة مع Ractor بعد.
تحقق سريع
اختبر مدى فهمك لـ Ractors.
مراجعة: Ractors
لقد تعلمت كيفية تنفيذ التوازي داخل العملية باستخدام Ractors:
- يشغّل
Ractor.newالتعليمات البرمجية بالتوازي، بينما تحصلtakeعلى النتيجة. - مرّر البيانات عبر الوسائط أو باستخدام
send، واستقبلها باستخدامRactor.receive. - تُنسخ الكائنات أو تُنقل، ولا تتم مشاركتها بحرية.
- تجمّد
Ractor.make_shareableالبيانات لمشاركتها بأمان.
وبذلك تكتمل دورة التزامن في Ruby: الخيوط، وGVL، و fibers، وRactors.
الأسئلة الشائعة
هل درس «Ractors» مجاني؟
نعم — نص درس «Ractors» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Ruby Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Ruby Academy 4 دروس في المجموع.
ماذا ستتعلم في «Ractors»؟
التوازي الحقيقي تتمرن على Ruby Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Ruby Academy؟
لا تُشترط خبرة سابقة. Ruby Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «Ractors»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Ruby Academy هذا؟
نعم. كل درس في Ruby Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.