Как подключить файл с помощью gevent - PullRequest
5 голосов
/ 19 марта 2012

У меня проблема с созданием функции хвоста gevent.В целом, код работает, когда я комментирую gevent.sleep в цикле, но тогда загрузка ЦП составляет 100%.Когда я покидаю gevent.sleep, программа работает, но ничего не происходит.Версия Gevent - 1.0b1.

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])

Ответы [ 3 ]

6 голосов
/ 23 марта 2012

Начиная с gevent 1.0b2 , вы можете использовать наблюдатели статистики для получения уведомлений об изменениях файлов.

См. Код и документацию libev для статистики.наблюдатели .

3 голосов
/ 07 ноября 2012

Ну, этот код не «хвостит» файл, он просто печатает весь файл, НО это показывает, как работает «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)
2 голосов
/ 19 марта 2012

Очевидно, неправильный подход.Это прекрасно работает:

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])
...