Seite 1 von 1

Queueing zwischen zwei Klassen

Verfasst: Sonntag 27. Oktober 2019, 12:38
von headhunter1978
Hallo zusammen,

Code: Alles auswählen


import queue
import time

class ClassA():

    def send(self, message_nums=10)
    
        for n in range(message_nums):
            time.sleep(0.2)
            queue.put('message number: {}'.format(n))

class ClassB():
    
    def receive(self):

        while True:
            try: 
                item = queue.get(timeout=1)
                print(item)
            except queue.Empty:
                break

        print('done.')

    

if __name__ == "__main__":
    queue = queue.Queue()

    classA = ClassA()
    classB = ClassB()

    classA.send()
    classB.receive()
Bei Ausführen des Skriptes bekomme ich folgende Fehlermeldung: AttributeError: 'Queue' object has no attribute 'Empty'. Habt ihr eine Idee, was ich falsch mache?

Re: Queueing zwischen zwei Klassen

Verfasst: Sonntag 27. Oktober 2019, 12:43
von __deets__
Wenn du den Namen des Moduls mit einem Variablennamen überschattest, dann ist das das Ergebnis. Du musst deinen queue Namen ändern. Am besten indem du auf die eh schlechten globalen Variablen verzichtest, und deine Klassen auch wirklich nutzt. Und die Queue als Argument an die beteiligten Objekte im Konstruktor übergibst.

Re: Queueing zwischen zwei Klassen

Verfasst: Sonntag 27. Oktober 2019, 13:50
von headhunter1978
Hallo,

Danke für die schnelle Antwort.

Ich habe den Code nochmal abgeändert. Irgendwie habe ich immer noch einen Denkfehler. Self.q hat nicht das Attribute Empty.

Code: Alles auswählen

import queue
import time

class ClassA():

    def __init__(self, q):
        self.q= q

    def send(self, message_nums=10):
    
        for n in range(message_nums):
            time.sleep(0.2)
            self.q.put('message number: {}'.format(n))

class ClassB():

    def __init__(self, q):
        self.q= q
    
    def receive(self):

        while True:
            try: 
                item = self.q.get(timeout=1)
                print(item)
            except self.q.empty:
                break

        print('done.')

    

if __name__ == "__main__":
    queue = queue.Queue()

    classA = ClassA(queue)
    classB = ClassB(queue)

    classA.send()
    classB.receive()


Re: Queueing zwischen zwei Klassen

Verfasst: Sonntag 27. Oktober 2019, 13:58
von __deets__
Natürlich hat es das nicht. Empty ist eine exception. Die ist im MODUL queue zu finden.

Re: Queueing zwischen zwei Klassen

Verfasst: Sonntag 27. Oktober 2019, 16:33
von __deets__
Und den Namen queue hast du immer noch global. Womit du den Modulnamen immer noch überbrätst. Das gehört in eine main-FUNKTION. Und die aus dem __main__-Guard aufgerufen.