gevent

2012-03-18 17 views
5

के साथ फ़ाइल को कैसे पूंछना है मुझे भूगर्भ पूंछ फ़ंक्शन का निर्माण करने में समस्या है। आम तौर पर, कोड काम करता है जब मैं gevent.sleep में लूप टिप्पणी करता हूं, लेकिन फिर CPU उपयोग 100% है। जब मैं gevent.sleep प्रोग्राम छोड़ देता हूं लेकिन कुछ भी नहीं हो रहा है। गीवेंट संस्करण 1.0b1 है।gevent

import os 
import gevent 

def follow(filename): 
    fd = os.open(filename, os.O_RDONLY|os.O_NONBLOCK) 
    os.lseek(fd, 0, os.SEEK_END) 
    hub = gevent.get_hub() 
    watcher = hub.loop.io(fd, 1) 
    while True: 
     hub.wait(watcher) 
     lines = os.read(fd, 4096).splitlines() 
     if not lines: 
      #gevent.sleep(.1) 
      continue 
     else: 
      for line in lines: 
       print "%s:%s" % (filename, line) 

    os.close(fd) 

if __name__ == '__main__': 
    job1 = gevent.spawn(follow, '/var/log/syslog') 
    job2 = gevent.spawn(follow, '/var/log/messages') 

    gevent.joinall([job1, job2]) 
+0

आप एक जवाब मिल गया है, तो यह एक जवाब के रूप में पोस्ट (और आप कर सकते हैं एक बार यह स्वीकार करते हैं) कोड – MByD

उत्तर

3

स्पष्ट रूप से गलत दृष्टिकोण। यह पूरी तरह से काम करता है:

import os 
import gevent 

def follow(filename): 
    fd = os.open(filename, os.O_RDONLY|os.O_NONBLOCK) 
    os.lseek(fd, 0, os.SEEK_END) 
    while True: 
     lines = os.read(fd, 4096).splitlines() 
     if not lines: 
      gevent.sleep(.5) 
      continue 
     else: 
      for line in lines: 
       print "%s:%s" % (filename, line) 

    os.close(fd) 

if __name__ == '__main__': 
    job1 = gevent.spawn(follow, '/var/log/syslog') 
    job2 = gevent.spawn(follow, '/var/log/messages') 

    gevent.joinall([job1, job2]) 
+0

पोस्टिंग के +1: धन्यवाद जोश इस लगभग ठीक है कि मैं क्या जरूरत है। मेरे पास ज़ीरोआरपीसी सर्वर है (गीवेंट का उपयोग करता है) और मुझे नई फाइलों और मौजूदा फाइलों में संशोधन दोनों के लिए एक संपूर्ण निर्देशिका की निगरानी करने की आवश्यकता है। मेरा गुगल मुझे असफल रहा है, क्या आप मुझे कोई पॉइंटर्स/कोड टुकड़े दे सकते हैं :) –

6

gevent 1.0b2 के साथ शुरू आप स्टेट पर नजर रखने वालों का उपयोग कर सकते फ़ाइल परिवर्तन पर सूचना पाने के लिए।

code और libev documentation for stat watchers देखें।

2

ठीक है, यह कोड फ़ाइल को 'पूंछ' नहीं करता है, यह सिर्फ पूरी फ़ाइल प्रिंट करता है, लेकिन यह दिखाता है कि 'loop.stat' कैसे काम करता है। यह फ़ाइल को बदलने के लिए इंतजार कर रहा है - या बस स्पर्श किया गया है, और उसके बाद प्रिंट की सामग्री। जब यह इंतजार होता है - इसमें लगभग कोई संसाधन नहीं होता है!

import gevent,os 

def follow(filename): 
    hub = gevent.get_hub() 
    watcher = hub.loop.stat(filename) 
    while True: 
     hub.wait(watcher) 
     with open(filename) as f: 
      print f.read() 

if __name__ == '__main__': 
    jobs=[gevent.spawn(follow,'/var/log/syslog')] 
    jobs+=[gevent.spawn(follow,'/var/log/messages')] 
    gevent.joinall(jobs) 
+0

+1 काम कर –

संबंधित मुद्दे