Queue

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

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
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

das steht bei der modulbeschreibung!
normalerweise ist das dann
cur.fetchall
cur.fetch***
(andere möglickeiten, habe ich grade vergessen)
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

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).
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

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.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Demfall verstehe ich die Queue nicht ;)
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Dann beschreib uns mal was du genau machen möchtest, dann kann dir sicher jemand helfen.

Gruss
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

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 :)
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Antworten