[Python-de] Neuer executer für *n*x

Pierre Bernhardt pierre at starcumulus.owl.de
Mon Feb 7 06:44:50 CET 2005


Pierre Bernhardt schrieb:

Hallo,

ich habe erst mal eine neue Klasse konstruiert, mit der man
Pipes als FIFO zwischenpuffern kann.

Das ganze ist relativ kurz gehalten und habe es deswegen
kurzerhand direkt in die Mail kopiert, damit man ggf.
dazu einzelne Punkte kritisieren kann. In jedem Fall ist
es garantiert Verbesserungswürdig(Python 2.4 kann ich leider
nicht einstzen):

#!/usr/bin/python
# -*- coding: utf8 -*-

from __future__ import division, generators
from time import sleep
from Queue import Queue, Full, Empty
from threading import Thread


class Wache(Queue, Thread):
     """Die Klasse überwacht einen filedescriptor und puffert
     den Inhalt in einer methodenbasierten Queue, das ganze in einem
     eigenen Thread, damit es zu (hoffentlich) keinen Deadlocks kommt."""
     def __init__(self, fd, readmode = True ,maxsize = 0):
         """fd entspricht dem Dateidescriptor zur Datei.
         readmode ist als Parameter gedacht, um mitzuteilen,
         ob der fd gelesen werden soll (default)"""
         Queue.__init__(self, maxsize)
         Thread.__init__(self)
         self.readmode = readmode
         self.fd = fd
         self.end = False
     def run(self):
         """Threadschleife, um die Daten vom fd in die queue oder
         den Queueinhalt in den FD zu schreiben (FIFO-like)"""
         while not self.end:
             sleep(1)
             # Schreibe kompletten FD-Inhalt in Queue
             if not self.full() and self.readmode:
                 data = self.fd.read()
                 #print data
                 if not data == None:
                     #print "Write in Queue from", self.fd, data
                     self.writeq(data)
             # Schreibe kompletten Queueinhalt in FD
             elif not self.empty() and not self.readmode:
                 print "Read from Queue to", self.fd
                 self.fd.write(self.readq())
     def writeq(self, data):
         """Schreibt data in die Queue. GGf. wird gewartet, wenn
         die Queue voll ist"""
         while self.full():
             sleep(1)
             pass
         if data:
             self.put_nowait(data)
     def readq(self):
         """Liest Queueinhalt und gibt Ihn zurück. Gibt false zurück
         wenn kein Item vorhanden."""
         if not self.empty():
             return self.get_nowait()
     def quit(self):
         self.fd.close()
         self.end = True

Ich seh gerade, mir fehlt noch, das das Objekt nach beenden
zerstört wird:-)

MfG...
Pierre

PS: Ich habe letzten auf dem Forum etwas gelesen, dass
jemand dort ein neues Modul gebaut hat, mit dem Streams
in FD's abgebildet werden können.
Vielleicht kann ich das Später als Ersatz verwenden.




-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 294 bytes
Beschreibung: OpenPGP digital signature
URL         : http://starship.python.net/pipermail/python-de/attachments/20050207/b3f6a28b/signature-0001.pgp