Wie beende ich einen Thread ohne klassen?

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
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

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.
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
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

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.
BlackJack

@Arp: Dann musst Du halt öfter das `running`-Flag abfragen. Wirklich „jederzeit” kann man Threads nun einmal nicht abbrechen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
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.
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Io ist doch auch durch und durch OOP.
Ja, stimmt. Aber es gibt keine immerhin keine Klassen. ;-)

Gruß, noisefloor
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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()
Zuletzt geändert von Darii am Samstag 27. August 2011, 08:14, insgesamt 2-mal geändert.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@sma: Kein Problem, ich gebe gerne Steilvorlagen. :D

Gruß, noisefloor
Antworten