تقنية

وكلاء متوازون: هل لكل فرع نسخة مستقلة من الحالة؟

رسم يميز إسناد حالة ونسخة خارجية عن نسخة عميقة لقائمة بسيطة
رسم تحريري لعقود نسخ معلنة؛ ليس اختبار توازي.

حالة الوكلاء المتوازين لا نفهمها من عدد أسماء الفروع. قد يعد التطبيق لكل مساعد قاموسا، لكن يحتاج المراجع إلى معرفة هل القواميس مستقلة وما داخلها من قوائم. نضيق المسألة إلى كائنات Python معلنة لتجهيز الفروع، دون قياس توازي أو الادعاء أن SDK ينسخ كل حالة تلقائيا.

الخلاصة السريعة

تحقق من الشيء المنسوخ ومستواه؛ إسناد اسم جديد لا ينسخ الكائن، ونسخ القاموس الخارجي قد يبقي قائمته الداخلية مشتركة.

  • توضح وثائق Python أن الإسناد ينشئ روابط للكائن ولا ينسخه، وأن النسخ السطحي يحتفظ بمراجع داخلية، مقابل النسخ العميق للكائن المركب. [1]
  • في مثال قاموس notes، إسناد اسم ب إلى أصل أ يترك الاسمين للكائن نفسه؛ إضافة ملاحظة إلى قائمته تظهر من كليهما.
  • نبدأ كل مثال نسخ مستقلا من الأصل الطازج قبل الإضافة؛ النسخ السطحي يبقي القائمة مشتركة في فرضنا، والعميق لهذه البنية البسيطة يفصلها.
  • نتائجنا تتبع ترتيب إضافة معلنا وبنية بسيطة؛ لا تثبت ترتيب الفروع المتزامنة أو عزل كل تبعيات التطبيق أو موارد الخدمة.

ما الفرق بين إسناد ونسخ؟

تذكر وثائق Python أن الإسناد لا ينسخ الكائنات. النسخ السطحي ينشئ كائنا مركبا ويضع فيه مراجع للأجزاء الأصلية، والنسخ العميق ينسخ الأجزاء بصورة متكررة. [1]

نربط ذلك بتحضير حالة فرعين، لا بذاكرة المحادثة التي وصلت إلى نموذج. يمكن أن ينشئ التطبيق أسماء متعددة دون إنشاء حالات مستقلة. وكذلك لا يعني لفظ نسخة وحده أن كل قائمة داخلية أصبحت منفصلة.

نقصر تمريننا على قاموس وقائمة نصوص عاديين. لا نمد حكمه إلى عملاء قواعد بيانات أو ملفات مفتوحة أو فئات ذات طريقة نسخ مخصصة.

كيف يختلف اسمان للكائن نفسه؟

نؤلف أصل أ، وهو قاموس يحتوي notes بقائمة فيها «راجع العنوان». نعلن أن ب حصل بإسناده إلى الكائن أ نفسه، لا بعملية نسخ. يتلقى فرعان في رسمنا هذين الاسمين؛ لم نشغل وكلاء.

نحدد ترتيب التمرين: تضاف أولا «احفظ النفي» إلى قائمة notes عبر ب، ثم تقرأ القائمة عبر أ. حسب عقدنا تصبح القراءة ذات ملاحظتين. لا توجد قائمتان مستقلتان لمجرد وجود اسمين.

هذه متابعة أثر إضافة معلنة، وليست وصفا للترتيب الذي سيحدث في تنفيذ متزامن. لو لم نعرف ترتيب الكتابة والقراءة، لا نستبدل به ترتيب الورقة الذي اخترناه.

لماذا تبقى قائمة مشتركة بعد نسخة خارجية؟

نعود إلى الأصل الأول ذي الملاحظة الواحدة ونعلن أن ج نسخة سطحية من القاموس. القاموس الخارجي مختلف، لكن قيمة notes تشير إلى القائمة نفسها بحسب هذا النسخ. إضافة الملاحظة عبر تلك القائمة في ج تظهر عند قراءتها من الأصل.

أما د في تمرين مستقل، فنعلنه نسخة عميقة من الأصل الأول لهذه البنية البسيطة. نضيف «احفظ النفي» إلى قائمة د؛ تبقى قائمة الأصل في هذا التمرين بملاحظتها الواحدة. لم نحذف الملاحظة من د ولم نعكس عملية خارجية.

نفصل التمرينين كيلا ننقل الأصل المعدل من الحالة السابقة خفية. تساوي النصوص في بداية النسخ لا يثبت وحده مشاركة القائمة أو استقلالها؛ العقد المعلن هو الذي حدد العلاقة.

ماذا يراجع مصمم المسار المتوازي؟

يكتب المصمم ما إذا كان كل فرع يتلقى الكائن نفسه أو نسخة سطحية أو نسخة مناسبة لبنيته. ثم يحدد أي أجزاء يجوز تعديلها وكيف يراجع أثر التعديل. لا يصف القواميس بأنها مستقلة قبل فحص مستوى النسخ.

لا يمنح مثالنا ضمان عزل بين جميع الوكلاء أو الخدمات، ولا يقيس مشكلة سباق أو نجاح مزامنة. اقتصر الحساب على قائمتين معلنتين وترتيب قراءة وكتابة اخترناه.

ويظل تقديم الملاحظات إلى النموذج مسألة أخرى: وجودها في قاموس التطبيق لا يعني إرسالها تلقائيا في رسالة. هنا نراجع مشاركة حالة التطبيق، ثم يراجع مسار آخر ما قدم من محتواها فعلا.

المصادر ومتابعة القراءة

  1. Python: copy، الإسناد والنسخ السطحي والعميق (يفتح في نافذة جديدة)docs.python.org

أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.