Цикл построчно и время настенных часов с фильтром Python - PullRequest
0 голосов
/ 11 марта 2011

У меня есть простой цикл вроде:

#Core Loop
chunk_size=1000
while True:
    line_c = 0 
    chunk_array = []
    while True:
        line = sys.stdin.readline()
        line_c +=1
        m = line_regex.match(line)
        if m:   
            chunk_array.append(m.groupdict())
        if line_c >= chunk_size:
            #print top_value(chunk_array, 'HTTP_HOST', 10)
            print stats(chunk_array, 'HTTP_HAPROXY_TT')
            break

Сценарий называется Unix-фильтром, например:

tail -f /var/log/web/stackoverflow.log | python logFilter.py

Вместо того, чтобы печатать каждые X строк, что будетхороший способ реорганизовать этот цикл для выполнения каждые X секунд?

Ссылка:
Функция статистики:

def stats(l, value):
    '''stats of an integer field'''
    m = []
    for line in l:
        if line[value].isdigit():
            m.append(int(line[value]))
    return "Mean: %s Min: %s Max: %s StdDev: %s" % (mean(m), amin(m), amax(m), std(m))

Входные данные будут являться строками сетиВ файле журнала line_regex превращает их в пары значений полей (groupdict).Вывод при использовании функции статистики выглядит следующим образом:

tail -f /var/log/web/stackoverflow.log | python logFilter.py -f HTTP_HAPROXY_TR -t stats
Mean: 183.43919598 Min: 0 Max: 3437 StdDev: 321.673112066
Mean: 182.768304915 Min: 0 Max: 2256 StdDev: 255.039386654
Mean: 142.672064777 Min: 0 Max: 1919 StdDev: 208.870675922

Таким образом, эти строки статистики печатаются каждый раз, когда скрипт получает 1000 строк.Вместо того, чтобы делать это каждые X строк, я хотел бы изменить цикл так, чтобы это происходило, скажем, каждые 10 секунд.

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Сделай это

import time
def time_chunk( some_source, period=10 ):
    start= time.time()
    buffer= []
    for line in some_source:
        buffer.append( line )
        if time.time() - start >= period:
            start= time.time()
            yield buffer
            buffer= []
    yield buffer

for chunk in time_chunk( sys.stdin ):  
    print( stats( chunk ) )
1 голос
/ 11 марта 2011

Чтобы сделать что-то каждые, скажем, 5 секунд в Python, вы можете использовать модуль signal. Чтобы включить таймер каждые 5 секунд, используйте

signal.setitimer(signal.ITIMER_REAL, 5.0, 5.0)

и установите обработчик, который в этом интервале вызывается

signal.signal(signal.SIGALRM, handler)

где handler - функция, которую вы хотите вызвать в этом интервале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...