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)
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