2010-06-17 13 views
0

Je commence le script avec ./file.py <pipe>> logfile et le script est:canal nommé en utilisant 100% du CPU

while True: 
    try: 
      I = raw_input().strip().split() 
    except EOFError: 
      continue 
    doSomething() 

Comment pourrais-je mieux gérer le nom pipe? Ce script fonctionne toujours à 100% CPU et il doit être en temps réel, donc je ne peux pas utiliser time.sleep.

Répondre

2

À EOF, vous allez boucler pour toujours obtenir un autre EOF. Aucune autre saisie ne sera effectuée après EOF. EOF ne signifie pas un «écart» dans les données. Cela signifie que la socket nommée a été déconnectée et ne peut plus être utilisée.

Si vous voulez des données "en temps réel", vous devez lire des octets individuels depuis le socket jusqu'à obtenir un "message" complet. Peut-être qu'un message se termine par '\n'. Vous ne pouvez pas utiliser raw_input.

Vous devez utiliser sys.stdin.read(1) pour obtenir des octets.

Les tuyaux, BTW, sont tamponnés. Donc, vous n'obtiendrez rien en temps réel. Si vous voulez "en temps réel" vous devez utiliser des sockets UDP, pas des pipes TCP.

2

« en temps réel » (! Car il est évidemment « soft » en temps réel étant donné que vous avez plusieurs processus en cours, et non pas « dur » en temps réel) ne veut pas dire « vous ne peut pas utiliser time.sleep »: même un tout petit la quantité de sommeil rendra les choses un peu meilleures - essayez d'ajouter un time.sleep(0.01) dans votre boucle, juste pour donner aux autres processus une meilleure chance de courir. Le manque de sommeil peut effectivement vous faire prendre un temps plus long en donnant aux autres processus très peu de chance de remplir le tuyau!

Au-delà, @ S. Lott a juste à droite: pour le comportement « réel timeoid », vous devez lire sys.stdin (mais il faut sans doute pas un octet à la fois, en fonction de la plate-forme: généralement sys.stdin.read(1024) va lire jusqu'à 1024 octets, lorsque sys.stdin est un tuyau ou une autre « brute » par opposition à « cuit » FD, mais le retour d'octets sont dans le tuyau, si < 100, plutôt que d'attendre - vous pouvez définir la FD à non-bloquant pour aider à assurer que) directement, et effectuer une manipulation de chaîne (par exemple pour mettre des lignes ensemble, les dépouiller, etc) plus tard dans votre code.

Questions connexes