باستخدام تحديد / استطلاع / Kque / Kevent لمشاهدة دليل للحصول على ملفات جديدة

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

سؤال

في تطبيقي أحتاج إلى مشاهدة دليل لملفات جديدة. كمية المرور كبيرة جدا وهناك ما لا يقل عن مئات الملفات الجديدة في الظهور في الثانية. حاليا أنا أستخدم حلقة مشغول مع هذا النوع من الفكرة:

while True:
  time.sleep(0.2)
  if len(os.listdir('.')) > 0:
    # do stuff

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

أحاول استخدام واحدة من الفئات المتاحة في select لاستطلاع دليلي، لكنني لست متأكدا مما إذا كان يعمل بالفعل، أو إذا كنت أفعل ذلك فقط.

أحصل على FD لدليلي مع:

fd = os.open('.', os.O_DIRECT)

لقد حاولت بعد ذلك عدة طرق لمعرفة متى يتغير الدليل. كمثال، أحد الأشياء التي جربتها هي:

poll = select.poll()
poll.register(fd, select.POLLIN)

poll.poll()  # returns (fd, 1) meaning 'ready to read'

os.read(fd, 4096) # prints largely gibberish but i can see that i'm pulling the files/folders contained in the directory at least

poll.poll()  # returns (fd, 1) again

os.read(fd, 4096) # empty string - no more data

لماذا الاستطلاع () يتصرف مثل هناك المزيد من المعلومات لقراءة؟ افترضت أنه لن يفعل ذلك فقط إذا تغير شيء ما في الدليل.

هل ما أحاول فعله هنا حتى ممكن؟

إذا لم يكن الأمر كذلك، فهل هناك أي بديل آخر أفضل ل while True: look for changes ?

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

المحلول

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

يبدو أنك بالفعل فعل الاقتراع المتزامن، عن طريق التحقق من الدولة على فترات منتظمة. لا تقلق بشأن الوقت "قضى" في sleep, ، لن تأكل الوقت وحدة المعالجة المركزية. يمر فقط السيطرة على نظام التشغيل الذي يستيقظ العملية بعد المهلة المطلوبة.

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

نصائح أخرى

FreeBSD وبالتالي يوفر Mac OS X تناظري من Inotify يسمى Kqueue. اكتب MAN 2 Kqueue على آلة FreeBSD لمزيد من المعلومات. بالنسبة إلى Kqueue على FreeBSD لديك Pykqueue متوفر في http://people.freebsd.org/~DWhite/pykqueue/, ، لسوء الحظ، لا يتم الحفاظ عليها بنشاط، لذلك قد يختلف الأميال.

لماذا لا تستخدم غلاف بيثون لأحد المكتبات لمراقبة تغييرات الملفات، مثل صبي أو inotify (البحث عن pyinotify، لا يسمح لي فقط بنشر ارتباط تشعبي واحد كمستخدم جديد ...) - من المؤكد أن تكون أسرع وأشياء منخفضة المستوى قد تم بالفعل في مستوى C بالنسبة لك، باستخدام واجهات kernel .. وبعد

قد ترغب في إلقاء نظرة على select.kqueue. - لم أستخدمها ولكن Kqueue هي الواجهة المناسبة لهذا تحت BSD وأعتقد ذلك حتى تتمكن من مراقبة الملفات / الدلائل وتسميتها مرة أخرى عندما تتغير فقط

لقد كتبت مكتبة وأداة شل يجب أن تتعامل مع هذا لك.

http://github.com/gorakhargosh/watchdog.

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

hth.

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