Io corro memcached con il seguente modello di comando bash:Impostazione della dimensione del buffer più piccola per sys.stdin?
memcached -vv 2>&1 | tee memkeywatch2010098.log 2>&1 | ~/bin/memtracer.py | tee memkeywatchCounts20100908.log
per cercare di rintracciare senza pari arriva a set di chiavi per la piattaforma larga.
Lo script di memtracer è sotto e funziona come desiderato, con un problema minore. Osservando la dimensione del file di registro intermedio, memtracer.py non inizia a ricevere input fino a quando memkeywatchYMD.log ha una dimensione di circa 15-18K. C'è un modo migliore per leggere in stdin o forse un modo per ridurre la dimensione del buffer fino a meno di 1k per tempi di risposta più rapidi?
#!/usr/bin/python
import sys
from collections import defaultdict
if __name__ == "__main__":
keys = defaultdict(int)
GET = 1
SET = 2
CLIENT = 1
SERVER = 2
#if <
for line in sys.stdin:
key = None
components = line.strip().split(" ")
#newConn = components[0][1:3]
direction = CLIENT if components[0].startswith("<") else SERVER
#if lastConn != newConn:
# lastConn = newConn
if direction == CLIENT:
command = SET if components[1] == "set" else GET
key = components[2]
if command == SET:
keys[key] -= 1
elif direction == SERVER:
command = components[1]
if command == "sending":
key = components[3]
keys[key] += 1
if key != None:
print "%s:%s" % (key, keys[key],)
grazie, il flag -u per un ambiente Linux è stato il vincitore. In precedenza avevo provato ad utilizzare os.fdopen e ho avuto lo stesso problema di buffering, anche se impostassi la dimensione del buffer su 10. – David
Sfortunatamente, Python 3 ancora apre ostinato 'stdin' in modalità testo bufferizzata. Solo 'stdout' e' stderr' sono influenzati dall'opzione '-u' ora. –
Qualche soluzione per Python3? Forse una libreria/opzione guidata dagli eventi? –