5

gevent テール関数の作成に問題があります。一般に、ループ内で gevent.sleep をコメントするとコードは機能しますが、CPU 使用率は 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])
4

3 に答える 3

6

gevent 1.0b2以降では、統計ウォッチャーを使用してファイルの変更に関する通知を受け取ることができます。

統計ウォッチャーのコードlibevのドキュメントを参照してください。

于 2012-03-23T06:30:29.430 に答える
3

まあ、それはコードがファイルを「末尾」にするのではなく、ファイル全体を出力するだけですが、「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)
于 2012-11-07T10:10:38.573 に答える
2

明らかに間違ったアプローチ。これは完全に機能します:

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])
于 2012-03-19T07:33:14.503 に答える