سؤال

لدي سؤال حول كيف flock() يعمل ، وخاصة في بيثون. لدي وحدة نمطية تفتح اتصال تسلسلي (عبر os.open()). أحتاج إلى جعل هذا الموضوع آمنًا. من السهل بما يكفي جعل الخيط آمن عند العمل في نفس الوحدة باستخدام threading.Lock(), ، ولكن إذا تم استيراد الوحدة النمطية من أماكن مختلفة ، فإنها تنكسر.

كنت أفكر في استخدام flock(), ، لكنني أواجه مشكلة في العثور على معلومات كافية حول كيفية عمل Flock بالضبط. قرأت أن Flock () يفتح الملف بمجرد إغلاق الملف. ولكن هل هناك موقف من شأنه أن يبقي الملف مفتوحًا إذا تعطل بيثون؟

وما يسمح بالضبط باستخدام الملف المقفل إذا LOCK_EX هو مجموعة؟ فقط الوحدة النمطية التي تغلق الملف؟ أي وحدة تم استيرادها من البرنامج النصي الذي تم تشغيله في الأصل؟

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

المحلول

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

تذكر، قطيع (2) مجرد استشاري:

الأقفال الاستشارية تسمح التعاون العمليات اللازمة لإجراء عمليات متسقة على الملفات ، ولكن قد لا تزال العمليات [الأخرى ، التي تصرفت بشكل سيئ] تصل إلى تلك الملفات دون استخدام الأقفال الاستشارية.

قطيع (2) ينفذ قفل القراء. لا يمكنك أن تترك نفس الملف مرتين LOCK_EX, ، ولكن يمكن لأي عدد من الناس أن يتدفقوا عليه LOCK_SH في وقت واحد (طالما لا أحد لديه LOCK_EX عليه).

تتيح آلية القفل نوعين من الأقفال: الأقفال المشتركة والأقفال الحصرية. في أي وقت قد يتم تطبيق أقفال مشتركة متعددة على ملف ، ولكن في أي وقت من الأوقات تكون متعددة حصرية ، أو مشتركًا وحصريًا ، المسموح به في وقت واحد على ملف.

يعمل Flock على مستوى نظام التشغيل/العملية وهو مستقل عن وحدات Python. قد تطلب وحدة واحدة ن أقفال ، أو ن يمكن طلب الأقفال عبر م الوحدات النمطية. ومع ذلك ، يمكن لعملية واحدة فقط عقد ملف LOCK_EX قفل على ملف معين في وقت معين.

YMMV على نظام "غير يونيكس" أو نظام ملفات غير محلي.

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