سؤال

وأنا أحاول أن أضيف نقل جديدة لالملتوية، والتي سوف قراءة البيانات من تيار - إما ملف بطريقة tail -f، أو من الأنابيب، ولكن لدي بعض المشاكل مع الهندسة المعمارية ملتوية

.

ولقد حصلت على نقل نفسه (تطبق ITransport) جاهزة - أنه يتعامل مع كل فتح الملف. لقد حصلت على وظائف يتدفقون / deferreds جاهزة. كيف أضع معا الآن؟ أود أن يقدم البيانات الجديدة إلى dataReceived() بعض البروتوكول.

وأنا يمكن بالطبع إنشاء كائن جديد من شأنها أن إعداد مراقبين I / O مع الاسترجاعات المناسبة، تسجيل رد على مفاعل اغلاق (لإغلاق الملفات / البروتوكولات) والبدء في كل شيء يدويا - ولكن هو أن " طريق صحيح"؟ هل هناك أي تجريد أجمل أتمكن من استخدام؟ رأيت reactor.connectWith()، ولكنه لا يوفر حقا الكثير من فكرة مجردة ...

وأيضا - كيف لي أن تمرير البيانات من وجهة نظري القارئ إلى البروتوكول؟ ITransport لا يحدد أي واجهة لذلك، على الرغم من أنه يبدو وكأنه مسؤولية النقل بالضبط.

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

المحلول

وهذا يبدو وكأنه كنت قد برزت في الغالب على كيفية القيام بذلك. كنت قد تكون مهتمة في twisted.internet.fdesc.readFromFD، لكنه خطوط قليلة فقط طويل وانها لا تفعل شيئا معقدا بشكل خاص (هو بضعة أسطر لم يكن لديك للحفاظ على، على الرغم من). وبصرف النظر عن ذلك - نعم، ما عليك القيام به رصد I / O في هذه الحالة، لأن غير معتمدة واصفات الملفات العادية التي حدد / استطلاع / epoll (أنها دائما الحصول على الإبلاغ عن استعداد، وليس ما تريد)

تم إجراء بعض العمل على دعم inotify في الملتوية ( http://twistedmatrix.com/trac/ticket / 972 )، ولكن هذا لم يكتمل بعد، لذلك لن يكون مفيدا مباشرة لك الآن (إلا إذا كنت تريد مساعدة الانتهاء منه ومن ثم استخدامها). على افتراض انك مجرد استخدام الاقتراع تستند إلى الوقت، فإن الكثير من ما هو في المفاعل لن تساعد بها كثيرا لك، منذ يركز هذا الرمز على استخدام استعداد API المتوفرة من قبل النظام (أي، حدد / استطلاع / epoll) لتحريك الأحداث .

لحالة الأنابيب، ورغم ذلك، يجب أن تكون قادرا على استخدام والاستفادة من أساليب IReactorFDSet ل- addReader آخرون

والنقل الاقتراع تستند إلى الوقت الخاص بك قد لا تزال تستفيد من تنفيذ ITransport - على الرغم من أنني لست متأكدا كيف سيكون تنفيذ write لنقل مثل tail -f. سوف تستفيد بالتأكيد من وجود وسائل النقل الخاصة بك تقديم البيانات عبر واجهة IProtocol، لأن هذا يبسط رمز إعادة استخدامها. IProtocol.dataReceived هو بالضبط كيف تريد لتمرير البيانات من هاتفك القارئ (أعتقد أن هذا هو نفس الخاص بك النقل ، أليس كذلك؟). لم يتم تعريف هذا على ITransport لأنها الطريقة التي ندعو بعض وجوه الآخرين وهو ليس النقل.

وreactor.connectWith ربما لن أشتري لك أي شيء. كما تقول، انها ليست الكثير من فكرة مجردة. انا اقول انها اكثر من خطأ. :)

لا تقلق كثيرا حول عدم القدرة على إضافة أساليب مباشرة إلى المفاعل. A-وظيفة الحرة التي تقبل مفاعل كمعلمة تماما كما هو سهلة الاستخدام.

لرد الاتصال الاغلاق، addReader يجب في الواقع تحصل على معظم الطريق هناك. إن أي قارئ في المفاعل في وقت الاغلاق يكون connectionLost دعاها (جزء من IFileDescriptor). يجب تنفيذ هذا لتنظيف الملفات والبروتوكول.

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