Seite 1 von 1
Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 11:17
von Arp
Hallo,
Wie beendet man eigentlich am besten einen Thread wenn man keine klassen im Programm einsetzt? (ich mag die nicht

)
Beispiel:
Code: Alles auswählen
import thread,time
x = 0
def blub():
global x
while 1:
x+=1
time.sleep(5)
thread.start_new_thread(blub,())
wenn man jetzt alle 5 sekunden print x ausführt, sieht man das x, wie es soll, um 1 steigt.
Aber, wie beendet man den thread wieder?
Thx.
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 11:26
von deets
Klassen nicht moegen ist etwas, das du dir abgewoehnen solltest. Genauso wie globale Variablen.
Davon abgesehen: gar nicht. Weder mit noch ohne Klassen. Threads beenden sich selbst, von aussen geht das ueblicherweise nicht, und selbst wenn manche Thread-Implementierungen das anbieten, fuehrt es oft zu undefiniertem Verhalten. Aus diesem guten Grund kann Python das nicht.
So wuerde man das machen koennen:
Code: Alles auswählen
from threading import Thread
class Worker(Thread):
def run(self):
self.running = True
while self.running:
... # die eigentliche Arbeit machen
w = Worker()
w.start()
time.sleep(10)
w.running = False
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 11:34
von Arp
Ich finde halt, da klassen unnötig kompliziert für mein programm sind. Zumal ich jetzt schon 500 zeilen code ohne klassen und mit einigen globalen variablen hab die ich jetzt ungern umschreiben will.
Es ist angenehm einfach für mein Programm, funktional und einfach zu verstehen. Naja, so denke ich zumindest
Was dein Beispiel angeht, so hat dies den nachteil das wenn im laufenden thread ein sleep(5) drin steht, wie in meinem Beispiel, der thread nur alle 5 sekunden prüft ob running auf true steht, und somit nur im 5 sekunden intervall beendet werden kann.
Ich würde aber gern das die zeilen in der funktion, wie in dem beispiel, zwar alle 5 sekunden abgearbeitet werden sollen, aber JEDERZEIT beendet werden kann.
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 11:38
von BlackJack
@Arp: Dann musst Du halt öfter das `running`-Flag abfragen. Wirklich „jederzeit” kann man Threads nun einmal nicht abbrechen.
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 11:44
von noisefloor
Hallo,
wenn man keine klassen im Programm einsetzt? (ich mag die nicht
In diesem Fall solltest du dich vielleicht in der Tat mal mit einer Nicht-OOP Programmiersprache beschäftigen...
Funktionale Programmierung mit Scala, Erlang oder Haskell ist im Moment so wie so in.
Oder was ganz anderes, wie ein Prototypen-basierter Ansatz wie z.B. Io (Suchbegriff für Google: Io language).
Gruß, noisefloor
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 12:01
von BlackJack
@noisefloor: Den Prototyp-Ansatz würde ich nicht als ganz was anderes bezeichnen. Io ist doch auch durch und durch OOP. Nur das die Grenze zwischen Klassen und Objekten noch weiter verwischt ist, als bei Python wo jede Klasse zwar ein Objekt ist, aber nicht jedes Objekt als Klasse verwendet werden kann. Bei Io ist vielleicht in diesem Fall das Actor-Modell für die Nebenläufigkeit interessant. Allerdings sind die als kooperatives Multitasking implementiert. Ansonsten gibt es noch `Thread`-Objekte die eine `endCurrentThread`-Methode kennen. Habe aber keine Ahnung wie sauber damit ein Thread beendet werden kann.
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 13:22
von Arp
Hi,
Ich hab das jetzt anders gelöst. Undzwar so das man den thread in sehr kurzen intervallen beenden kann, aber die hauptaufgabe alle x sekunden ausgeführt wird.
Falls es jemanden interessiert, bzw. für jemanden nützlich sein kann:
Code: Alles auswählen
import thread,time,datetime
x = 0
stopped = False
def blub():
global x
t1 = datetime.datetime.now()
while not stopped:
t2 = datetime.datetime.now()
tend = t1+datetime.timedelta(seconds=5)
if t2<tend:
time.sleep(0.1)
else:
x+=1
t1=datetime.datetime.now()
thread.start_new_thread(blub,())
wenn jetzt irgendwo im restlichen code stopped = True gesetzt wird, beendet der thread innerhalb von 0.1 sekunden, aber die hauptarbeit wird erst alle 5 sekunden ausgeführt.
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 13:59
von EyDu
Hallo.
Mit einem Event oder eine Queue hättest du das viel einfacher und in schön haben können. Bei deiner Anmerkung zu `global` und das in Kombination mit Nebenläufigkeiten, da bekomme ich fast schon Angstzustände
Sebastian
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 18:46
von noisefloor
Hallo,
Io ist doch auch durch und durch OOP.
Ja, stimmt. Aber es gibt keine immerhin keine Klassen.
Gruß, noisefloor
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 19:48
von Darii
Arp hat geschrieben:Ich finde halt, da klassen unnötig kompliziert für mein programm sind.
Unnötig kompliziert? Vergleiche mal deets code mit folgendem:
Code: Alles auswählen
def start_stoppable_thread():
should_run = [True]
def stop():
should_run[:] = [False]
def worker(*args, **kwargs):
while should_run[0]:
pass # was auch immer du machen willst
return stop, thread.start_new_thread(worker, args, kwargs)
stop_thread, thread = start_stoppable_thread()
time.sleep(10)
stop_thread()
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Freitag 26. August 2011, 21:14
von noisefloor
Hallo,
@Arp: So unter uns - ich habe auch, als ich mit Python angefangen habe, keine Klassen genutzt. Nicht, weil ich nicht wollte, sondern weil es auch ohne ging. Wenn man erst Mal "den Dreh" raus hat wird damit seeeehr vieles einfacher, klarer (und der Code kürzer). Ergo: aus Prinzip sperren ist der falsche Weg.
Gruß, noisefloor
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Samstag 27. August 2011, 08:44
von sma
noisefloor hat geschrieben:In diesem Fall solltest du dich vielleicht in der Tat mal mit einer Nicht-OOP Programmiersprache beschäftigen...
Funktionale Programmierung mit Scala, Erlang oder Haskell ist im Moment so wie so in.
Oder was ganz anderes, wie ein Prototypen-basierter Ansatz wie z.B. Io (Suchbegriff für Google: Io language).
Oh, eine Gelegenheit, ein bisschen zu Klugscheißen
Scala ist objektorientiert und hat Klassen, Prozesse bei Erlang kann man mit Klassen gleichsetzen und es auch als objektorientiert bezeichnen, weil diese Prozesse und ihre Art zu kommunizieren ziemlich genau mit der Vision übereinstimmen, wie sich Alan Kay die Objektorientierung vorgestellt hat (und er hat immerhin diesen Begriff erfunden) und Haskell klassifiziert Typen.
Io (oder das Vorbild Self) haben zwar keine Klassen, sind aber eher objektorientiert als funktional. Zudem war die wichtigste Erkenntnis von Self als die Essenz von Smalltalk, dass Klassen eben auch nur Objekte sind, die eine spezielle Rolle spielen und diese Rollen hat man bei Self in Form von Traits explizit gemacht. Die Denkweise ist aber die selbe, nur die Implementierung ist eine andere. Io hat außerdem wieder das Actor-Modell von Erlang.
Stefan
PS: Wenn dieser Beitrag eine Moral hat, dann diese: Klassifikation ist eine wichtige Form der Abstraktion und wenn diese im Handwerkskoffer eines Softwerkers fehlt, ist das schlecht.
Re: Wie beende ich einen Thread ohne klassen?
Verfasst: Samstag 27. August 2011, 12:07
von noisefloor
Hallo,
@sma: Kein Problem, ich gebe gerne Steilvorlagen.
Gruß, noisefloor