تقنية

_thread في بايثون: هل فشل acquire(False) يحرر القفل؟

فشل المحاولة مع بقاء القفل
بعد اكتساب أول. [1] [2]

نجرب قفلًا جديدًا بلا خيوط عاملة. [1] [2]

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

لا؛ فشل المحاولة الثانية لا يحرر القفل المكتسب أولًا. [1] [2]

  • يطبع مثالنا False True ثم False. [1] [2]
  • القفل الجديد يبدأ غير مقفل؛ اكتسبناه مرة. [1] [2]
  • acquire(False) لا تنتظر؛ تعيد False هنا. [1] [2]
  • يبقى locked() بالقيمة True إلى release(). [1] [2]
  • تحرير واحد يكفي؛ لم تنجح المحاولة الثانية. اختبرنا 3.12.14. [1] [2]

المثال

import _thread
lock=_thread.allocate_lock()
lock.acquire()
print(lock.acquire(False),lock.locked())
lock.release()
print(lock.locked())

[1] [2]

النتيجة والحالة

القفل هنا بدائي، لا عداد مرات اكتساب. افصل بين نتيجة محاولة الاكتساب وحالة القفل؛ الفشل لا ينفذ release. ولو حررناه قبل المحاولة الثانية، تنجح وتصبح الحالة مقفلة مجددًا. [1] [2]

تحرير واحد يفك القفل
لم تنجح المحاولة الثانية. [1] [2]

الحدود

لم ننشئ خيطًا عاملًا أو نختبر السباقات وترتيب الانتظار. لا تستبدل المحاولة الثانية باكتساب حاجب في هذا المثال؛ القفل ما زال مقفلًا. [1] [2]

المراجع

  1. Python: _thread والقفل
  2. CPython3.12.14: _threadmodule.c
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

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