Seite 1 von 1

Queue

Verfasst: Samstag 24. Juni 2006, 10:35
von DatenMetzgerX
Ich habe eine Queue. Fügt edie Elemente mit put ein. Nur wie kann ich es machen, das ich einen return Value bekomme also z.B

Code: Alles auswählen

class Execute(threading.Thread):
    def __init__(self, job, ausschalter):
        threading.Thread.__init__(self)
        self.job = job
        self.ausschalter = ausschalter
        
    def run(self):
        conn = pysql.connect("db.s3db", isolation_level=None)
        cur = conn.cursor()
        
        if not conn or not cur:
            return
        
        while True:
            anweisung= self.job.get()
            print os.linesep + str(anweisung)
            
            if anweisung =='quit':
                self.ausschalter.set()
                break
            
            if type(anweisung)== str:
                try:
                    conn.execute(anweisung)
                except pysql.Error, ex:
                    print os.linesep + str(ex)
                
            if type(anweisung)==list:
                strSql = anweisung[-1]
                del anweisung[-1]
                try:
                    conn.executemany(strSql, anweisung)
                except pysql.Error, ex:
                    print os.linesep + str(ex)
                    
            return 'test'
                    
        cur.close()
        conn.close()
und jetzt sollte ich natürlich das ERgebnis der Abfrage haben. Wie komme ich an das

Verfasst: Samstag 24. Juni 2006, 12:21
von murph
das steht bei der modulbeschreibung!
normalerweise ist das dann
cur.fetchall
cur.fetch***
(andere möglickeiten, habe ich grade vergessen)

Verfasst: Samstag 24. Juni 2006, 12:56
von DatenMetzgerX
es geht mir nicht um den sql befehl...

Sondern ich füge ein Element in die Queue ein, aber da krieg ich immer nur None zurück (obwohl return 'test' vorhanden ist).

Verfasst: Samstag 24. Juni 2006, 13:45
von murph
kann es mit dem anderen return zusammenhängen?
oben steht, dass er, wenn er keine verbindung hinbekommt,
mit nichts returnen soll.
das return "test" scheint ja einwandfrei zu sein.

Verfasst: Samstag 24. Juni 2006, 13:51
von DatenMetzgerX
an dem liegt es nicht, denn das trifft nicht ein...

Habe ein wenig gedubuged, und habe herausgefunden, dass nach dem Queue.put(anweisung) er nicht auf den return Value wartet, sondern einfach weitergeht.

Verfasst: Samstag 24. Juni 2006, 16:39
von rayo
Hi

Du verstehst da glaubs die Queue falsch oder ich versteh dich nicht was du damit machen möchtest. Queue.put(anweisung) gibt nie etwas zurück.

Du brauchst warscheinlich noch eine zweite Queue:

Code: Alles auswählen

im Thread:
    while 1:
        anweisung = self.job.get()
        ...
        tuwas
        ...
        self.answer.put(returnValue)

Ausserhalb:
    thread.job.put('sqlstring')
    answer = thread.answer.get()
Aber somit brauchst du gar keinen Thread mehr, weil du immer auf die Antwort wartest.

Gruss

Verfasst: Samstag 24. Juni 2006, 16:40
von DatenMetzgerX
Demfall verstehe ich die Queue nicht ;)

Verfasst: Samstag 24. Juni 2006, 16:45
von rayo
Dann beschreib uns mal was du genau machen möchtest, dann kann dir sicher jemand helfen.

Gruss

Verfasst: Samstag 24. Juni 2006, 16:47
von DatenMetzgerX
Ich wollte eine Funktion machen (evtl auch 2 Read/write), welche mir die SQL Befehle ausführen. Da ich aber keine Lust habe im ganzen Programm immer den Cursor und die Connection mitzuschleppen (Globale Variabeln mag ich nicht ;)) dachte ich mir, evtl. könnte ich ja was mit queues machen.

Nur hätte ich dort auch die Queue jeder Funktion übergeben müssen, wäre allerdings eine Variable weniger gewesen.

Verfasst: Samstag 24. Juni 2006, 17:10
von rayo
Was spricht gegen eine normale Klasse die das ganze Datenbankzeugs übernimmt und du nur noch Funktionen von dieser aufrufst?

So könnte mal die Grundstruktur aussehen:

Code: Alles auswählen

class Database:
    def __init__(self, server, db, user, password):
        mach_verbindung

    def __query(self, query, params=None):
        return self.cur.execute(query, params)

    def getMeineDaten(self, meinName):
        self.__query('select id from namen where name=?',(meinName,))
        return self.cur.fetchone()

    def getListe(self):
        self.__query('select id,name from namen')
        for x in self.cur: #keine Ahnung ob das im DB modul geht, einfach alle Results durchgehen
            yield x

Code: Alles auswählen

print db.getMeineDaten('ich')
for x in db.getListe():
    print x
Somit hast du das ganze SQL-Zeugs an einem Ort und kannst es jederzeit einfach ändern.

Gruss

Verfasst: Samstag 24. Juni 2006, 17:12
von DatenMetzgerX
Da ich die Variable db (bei Dir) im ganzen Programm übergeben muss (wenn ich abfragen machen muss). Ich will nicht, dass ich immer die Verbindung trennen muss.

Aber wäre eine möglichkeit :)

Verfasst: Samstag 24. Juni 2006, 17:18
von rayo
Hast du den nso enorm viele Klassen? Die Variable db kannst du ja beim erstellen der Klassen übergeben und dann in der Klasse speichern.

Somit musst du die Variable nicht immer mit übergeben.

Gruss