Seite 1 von 1

Threading module

Verfasst: Freitag 4. März 2022, 11:23
von dope791
Hallo zusammen,

die offizielle Dokumentation von Python beschreibt ein Timer Objekt folgendermaßen:

"This class represents an action that should be run only after a certain amount of time has passed — a timer. Timer is a subclass of Thread and as such also functions as an example of creating custom threads.

Timers are started, as with threads, by calling their start() method. The timer can be stopped (before its action has begun) by calling the cancel() method. The interval the timer will wait before executing its action may not be exactly the same as the interval specified by the user." (https://docs.python.org/3/library/threa ... er-objects)

Ich bin mir unsicher ob ein Timer Objekt
1) nur selbst ein Thread ist der den Main-Prozess wieder aufruft nach x Sekunden (gewünschte Funktion)
2) die gewünschte Funktion im selben Thread ausgeführt wird wie der Timer
...

Danke für Gedanken.

Freundliche Grüße

Re: Threading module

Verfasst: Freitag 4. März 2022, 12:08
von __deets__
Letzteres. Es gibt keinen guten Weg, wie man (unkooperativ) einen Thread unterbrechen kann, und entsprechend kann man da auch nix ausführen. Signale sind eine, aber nicht besonders gut zu benutzen, weil es im Grunde nur einen Timer gibt: https://docs.python.org/3/library/signa ... gnal.alarm

Wenn du zb asyncio benutz, kannst du Timer im Main thread haben. Musst aber natürlich auch mal was awaiten in jedem Code. Das ist der kooperative Teil.

Re: Threading module

Verfasst: Freitag 4. März 2022, 12:40
von dope791
Das bedeutet

Code: Alles auswählen

Timer(4.0, Thread(target = somefunction), args=(i,)).start()
wäre doppelt gemoppelt. (?)

Re: Threading module

Verfasst: Freitag 4. März 2022, 13:41
von __deets__
Das ist geraten und auch sinnlos. Warum denkst du mehr Threads sorgen dafür, dass im Main Thread etwas passiert?

Re: Threading module

Verfasst: Freitag 4. März 2022, 17:15
von dope791
Meine Frage war, ob ein Timer selbst ein Thread darstellt, der nach x Sekunden fertig ist oder ob der Aufruf des Timers, also die Funktion, auch im Thread des Timers läuft.

Es wäre nett, wenn wir hier sachlich bleiben.

Re: Threading module

Verfasst: Freitag 4. März 2022, 17:34
von __deets__
War es etwa nicht geraten? Du übergibst ein Thread Objekt (ungestartet) als callable an Timer. Und Threads sind nicht aufrufbar.

Code: Alles auswählen

>>> t = threading.Thread(target=print, args=('hallo',))
>>> t
<Thread(Thread-1, initial)>
>>> t()
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: 'Thread' object is not callable

>>> timer = threading.Timer(1, t).start()
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/var/containers/Bundle/Application/AC7962CE-A929-47DA-ACDD-623818F721A2/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/var/containers/Bundle/Application/AC7962CE-A929-47DA-ACDD-623818F721A2/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/threading.py", line 1183, in run
    self.function(*self.args, **self.kwargs)
TypeError: 'Thread' object is not callable
Der Code ist also nie gelaufen. Was an “geraten” ist also bitte unsachlich? Und da du gerne gute Umgangsformen einforderst: es ist eine Unsitte, sich Code auszudenken, den man in wenigen Sekunden selbst ausprobiert hat, um dann anderen Leuten die Arbeit aufzubürden, das zu falsifizieren.

Zur umformulierten Frage: weder ein Thread-Objekt noch ein Timer-Objekt stellen einen Thread dar. Verwirrend, ich weiß. Aber ist so. Es gibt schlicht keinen Zusammenhang zwischen Objekten und threads. Alles, was da passiert, ist, dass ein Thread Objekt beim Aufruf von start vom OS einen thread anfordert, der das target dann ausführt. Das Objekt verwaltet dann dessen ID, Aber hat an sich keinen Einfluss auf den. Nicht zuletzt heißt das vor allem, dass keine der Methoden, die das Objekt hat, plötzlich vom gestarteten Thread ausgeführt werden.

Entsprechend ist Teil eins der Antwort: nein, da läuft kein Thread, nur weil es ein Timer-Objekt ist. Nach Aufruf von start wird ein Thread erzeugt, der eine Funktion aufruft, die folgendes macht:

- schlafen bis zum timeout.
- prüfen, ob der Timer abgebrochen wurde.
- wenn nicht, das target bzw die übrgebene Funktion aufrufen. Die Laufzeit des gestarteten Threads ist dann bestimmt von der Laufzeit eben dieser Funktion. Kann also auch endlos sein. Und diese Funktion läuft parallel zu allen anderen potentiellen Threads, Main wie anderen, also zb auch durch Timern erzeugten.

Re: Threading module

Verfasst: Freitag 4. März 2022, 17:56
von dope791
Ich bin empört, dass mir unterstellt wird ich denke mir Code aus um anderen Menschen
Arbeit aufzubürden
.
Das war nicht mein Ziel, keineswegs sind Sie oder sonst jemand dazu verpflichtet auf diese Frage hier überhaupt eine Antwort zu geben!

Der Code snippet war ein Teil meines langen Codes, den ich nicht hier eingestellt habe.
Ich konnte gerade nachvollziehen, dass der Code snippet auf den ich mich oben bezogen habe so nicht ausführbar ist. Vielen Dank für diesen Hinweis.
Jedoch hatte ich hauptsächlich eine Verständnisfrage gestellt, der Code snippet sollte nur als Erläuterung meines Problems dienen, und kein konkretes Fallbeispiel nicht ausführen können.

Re: Threading module

Verfasst: Samstag 5. März 2022, 12:53
von rogerb
Meine Frage war, ob ein Timer selbst ein Thread darstellt, der nach x Sekunden fertig ist oder ob der Aufruf des Timers, also die Funktion, auch im Thread des Timers läuft.
Laut zitierter Dokumentation ist "Timer" ja eine abgeleitete Klasse von "Thread". Damit ist ein Timer grob gesehen ein spezieller Thread, und teilt gewisse Funktionalitäten mit einem Thread.
Beim Timer gibt es auch noch eine erweiterte Funktionalität, nämlich die "cancel" Methode, die es beim Thread nicht gibt.
Außerdem hat der Timer noch einen 'finished' Event der gesetzt wird wenn der Timer abgelaufen ist oder ge-canceled wurde. Das könnte man vielleicht unter "ist fertig" verstehen.

Also, ja ein Timer is ein spezieller Thread.