Queues und Threads

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
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

Mittwoch 28. Mai 2008, 10:50

Zunächst mal der Code um den es geht.

Code: Alles auswählen

#!/usr/bin/python

from Queue import Queue, Empty
from threading import Thread
import time

class QueueWaiter(Thread):

    def __init__(self, inqueue, outqueue, timeout=1):
        self.inqueue = inqueue
        self.outqueue = outqueue
        self.timeout = timeout
        self._alive = True
        Thread.__init__(self)
        self.init()

    def init(self):
        pass

    def output(self, item):
        if not item == None:
            self.outqueue.put(item)

    def process(self, item):
        pass

    def run(self):
        while self._alive:
            try:
                item = self.inqueue.get(block=False)
                self.output(self.process(item))
            except Empty:
                time.sleep(self.timeout)

            

class AppendA(QueueWaiter):

    def process(self, item):
        return str(item) + 'a'

class AppendB(QueueWaiter):

    def process(self, item):
        item += 'b'
        print item

aQueue = Queue()
bQueue = Queue()

AppendA(aQueue, bQueue).start()
AppendB(bQueue, None).start()
            

for i in range(100):
    aQueue.put(i)

Ich habe eine Basisklasse, die von Thread abgeleitet ist, die einen Eingangs und einen Ausgangsqueue hat. Bei jedem Thread-Loop wird ein Objekt aus dem Eingangsqueue entnommen, an die Methode process() übergeben und die Rückgabe (wenn vorhanden) in den Ausgangsqueue gepackt.
Einsatzweck dafür z.b.: Thread1 läd eine Liste von URLs herunter. Thread2 verarbeitet die URLs und läd wiederum etwas herunter.

Dazu jetzt einige Fragen:
- Macht sowas tatsächlich Sinn? Leider sind mir Thread in Python immernoch ein Rätsel.
- Soweit ich weiß werden Threads in Python nicht wirklich parallel verarbeitet, sofern der Thread nicht den Global Interpreter Lock zurückgibt. Das geschieht aber nur bei bestimmtne Dingen (z.b. beim warten auf IO). In sofern würde in meinem Fall mit dem Download das ganze ja schon einen Sinn ergeben.
- Dazu weiter: Gibt es eine brauchbare Erklärung zu Threads und dem GIL in Python. Google ist da leider keine große Hilfe. Ich wüsste gerne den Hintergrund dazu und in wie weit parallele Verarbeitung in Python möglich ist und sinn macht.
- Wieso kann ich das Beispiel nicht mit Strg+C unterbrechen. Meinem Verständnis nach müsste time.sleep() doch den GIL zurückgeben, so das der Hauptthread die Kontrolle zurück erlangt und das Programm terminieren könnte.
- Generelle Anmerkungen zum Code
Antworten