سؤال

إذا لم يكن الأمر كذلك ، فهل هناك طريقة يمكنني ضمان سلامة الموضوع من خلال البرمجة بطريقة معينة؟

للتوضيح ، عند الحديث عن "Threadsafe" ، أعني خيوط Python ، وليس خيوط مستوى OS.

هل كانت مفيدة؟

المحلول

كل هذا يتوقف على التفاعل بين رمز Cython الخاص بك وجيل Python ، كما هو موثق بالتفصيل هنا. إذا لم تفعل أي شيء خاص ، فإن الكود الذي تم إنشاؤه بواسطة Cython سيحترم GIL (وكذلك امتداد مشفر C لا يستخدم وحدات الماكرو لإطلاق GIL) ؛ هذا يجعل مثل هذا الرمز "كـ Threadsafe مثل رمز Python"-وهو ليس كثيرًا ، ولكن من الأسهل التعامل معه من رمز الخيوط الحرة تمامًا (لا تزال بحاجة إلى تعاون متعددة الخيوط ومزامنة ، بشكل مثالي مع مثيلات قائمة انتظار قفل & ج).

لا ينبغي أن يتفاعل الكود الذي تخلّى عن GIL ولم يتم الحصول عليه بعد بأي شكل من الأشكال مع وقت تشغيل Python والكائنات التي يستخدمها وقت تشغيل Python-وهذا ينطبق على Cython تمامًا وكذلك للامتدادات المشفرة C. الاتجاه الصعودي هو بالطبع يمكن أن يعمل هذا الرمز على قلب منفصل (حتى يحتاج إلى مزامنة أو بأي حال من الأحوال التواصل مع وقت تشغيل Python مرة أخرى ، بالطبع).

نصائح أخرى

يعني قفل المترجم العالمي في Python أن موضوع واحد فقط يمكن أن يكون نشطًا في المترجم الفوري في أي وقت. ومع ذلك ، بمجرد تمرير التحكم إلى امتداد C ، يمكن أن يكون مؤشر ترابط آخر نشطًا داخل المترجم. يمكن إنشاء خيوط متعددة ، ولا يوجد شيء يمنع مقاطع الخيط في منتصف القسم الحرج. ن

على رمز آمن مؤشرات الترابط يمكن تنفيذها داخل المترجم المترجم ، لذلك لا يوجد شيء عن الكود الذي يعمل داخل المترجم المترجم هو بطبيعته آمنة. لا يزال بإمكان الكود في وحدات Pyrex تعديل هياكل البيانات المرئية لرمز Python. يمكن أن يكون للكود الأصلي ، بالطبع ، مشكلات في الخيوط مع هياكل البيانات الأصلية.

لا يمكنك ضمان سلامة مؤشرات الترابط إلى ما وراء استخدام التصميم المناسبين والمزامنة - لا يغير GIL على مترجم Python هذا الأمر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top