سؤال

تحرير: ايم السؤال عما إذا كانت المتغيرات العالمية آمنة في إطار ويب واحد الخيوط مثل Tornado

أنا باستخدام Orm MongoEngine، الذي يحصل على اتصال قاعدة بيانات من متغير عالمي:

_get_db() # gets the db connection

IM أيضا باستخدام Tornado، إطار Web Python واحد الخيوط. في طريقة عرض واحدة، أحتاج إلى الاستيلاء على اتصال قاعدة البيانات وديرليل DBRef كائن [على غرار مفتاح أجنبي]:

# dereference a DBRef
_get_db().dereference(some_db_ref)

منذ أن عاد الاتصال من قبل _get_db هو var العالمية، هل هناك إمكانية للتصادم والقيمة الخاطئة التي يتم إرجاعها إلى موضوع خاطئ؟

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

المحلول

على افتراض MongoEngine هو التفاف Pymongo (وأعتقد أنه)، ثم يجب أن تكون على ما يرام. Pymongo هو خزائن مؤشر ترابط تماما.

نصائح أخرى

المواضيع مطلوبة دائما لعقد GIL عند التفاعل مع كائنات Python. مساحة الاسم التي تحمل المتغيرات كائن بيثون (إما الإطار الإذطى أو DICT، اعتمادا على نوع المتغير هو.) من الآمن دائما الحصول على أو تعيين المتغيرات في مؤشرات ترابط متعددة. لن تحصل أبدا على بيانات القمامة.

ومع ذلك، تنطبق شروط السباق المعتادة على أي كائن تحصل عليه، أو أي كائن تحل محله عند تعيينه. بيان مثل x += 1 هو ليس آمنة الخيط، لأن مؤشر ترابط مختلف يمكن تشغيلها بين الحصول على المتجر، وتغيير قيمة x, ، الذي ستحدث بعد ذلك.

لا، ولكن الأقفال واضحة جدا للاستخدام في بيثون. استخدم المحاولة: أخيرا: نمط للتأكد من إصدار قفل بعد تعديل المتغير العالمي الخاص بك.

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

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

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