2012-03-18 2 views
5

У меня проблема с построением функции gevent tail. В общем, код работает, когда я комментирую gevent.sleep в цикле, но тогда загрузка процессора составляет 100%. Когда я оставляю программу gevent.sleep, ничего не происходит. Версия Gevent 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 для размещения рабочего кода –

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: Спасибо Josh это почти то, что мне нужно. У меня есть сервер ZeroRPC (использует Gevent), и мне нужно отслеживать весь каталог для новых файлов и изменять существующие файлы. Мой googling терпит неудачу, можете ли вы дать мне какие-либо указатели/фрагменты кода :) –

Смежные вопросы