2012-03-18 8 views
5

Tengo un problema al construir la función gevent tail. En general, el código funciona cuando comento gevent.sleep en loop, pero la utilización de la CPU es 100%. Cuando salgo del programa gevent.sleep funciona pero no pasa nada. La versión de Gevent es 1.0b1.Cómo alinear un archivo con 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

Si has encontrado una respuesta, publicar como una respuesta (y aceptar que una vez que puede) – MByD

Respuesta

3

Obviously wrong approach. Esto funciona perfectamente:

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 para su publicación código –

2

Bueno, ese código no 'alinea' el archivo, solo imprime todo el archivo, PERO muestra cómo funciona 'loop.stat'. Espera a que el archivo cambie, o simplemente lo toque, y luego imprima el contenido. Cuando es esperar, ¡casi no se necesitan recursos!

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 de trabajo: Gracias Josh esto es casi exactamente lo que necesito. Tengo un servidor ZeroRPC (usa Gevent) y necesito monitorear un directorio completo para ambos archivos nuevos y la modificación de los archivos existentes. Mi Google me está fallando, ¿puedes darme algún fragmento de código/puntero :) –