السماح للمواضيع من Python بعد استدعاء رمز I/O الحظر في امتداد Python الذي تم إنشاؤه باستخدام Swig

StackOverflow https://stackoverflow.com/questions/2510696

  •  22-09-2019
  •  | 
  •  

سؤال

لقد كتبت امتداد بيثون يلف مكتبة C ++ موجودة Live555 (لف واجهة عميل RTSP ليكون محددًا) في SWIG. يعمل الامتداد عندما يتم تشغيله في مؤشر ترابط واحد ، ولكن بمجرد أن أتصل بوظيفة حلقة الحدث للمكتبة ، لم يحصل مترجم Python أبدًا على السيطرة. لذلك إذا قمت بإنشاء مهمة مجدولة باستخدام threading.Timer مباشرة قبل الاتصال بحلقة الحدث ، لم يتم تنفيذ هذه المهمة أبدًا بمجرد بدء حلقة الحدث. لإصلاح هذه المشكلة ، أضفت Py_BEGIN_ALLOW_THREADS و Py_END_ALLOW_THREADS وحدات الماكرو يدويًا في ملف CXX الذي تم إنشاؤه تلقائيًا SWIG حول كل doEventLoop() استدعاء وظيفة. لكن الآن ، أريد أن أفعل الشيء نفسه (أي السماح لخيوط) عندما يقوم SWIG بإنشاء الكود نفسه وعدم تغيير أي رمز يدويًا. هل قام أي شخص بعمل شيء مشابه في Swig؟

ملاحظة - أود أن أفكر أيضًا في التحول إلى أي إطار عمل آخر (مثل SIP) للحصول على هذا العمل. لقد اخترت Swig على أي تقنية أخرى لأن كتابة واجهة SWIG كانت سهلة للغاية واضطررت فقط إلى تضمين ملفات الرأس الحالية.

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

المحلول

يمنحك Swig الكثير من السنانير للمساعدة في تحقيق ذلك. إذا كان الحل الخشن كافياً لاحتياجاتك ، فسيكون هناك شيء واحد قمت به في الماضي هو وضع شيء مثل هذا في ملف .swig الخاص بي:

%exception {
    Py_BEGIN_ALLOW_THREADS
    $action
    Py_END_ALLOW_THREADS
}

يستخدم هذا (AB) منشأة SWIG لتزيين مكالمات وظائف C مع نوع من منطق معالجة الأخطاء من أجل تزيين تلك المكالمات باستخدام GIL Unlock/Lock. يرى استثناء معالجة مع استثناء ٪ في مستندات SWIG للحصول على تفاصيل حول ما يحدث هنا.

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