Threading module

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
dope791
User
Beiträge: 4
Registriert: Freitag 4. März 2022, 11:16

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
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
dope791
User
Beiträge: 4
Registriert: Freitag 4. März 2022, 11:16

Das bedeutet

Code: Alles auswählen

Timer(4.0, Thread(target = somefunction), args=(i,)).start()
wäre doppelt gemoppelt. (?)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist geraten und auch sinnlos. Warum denkst du mehr Threads sorgen dafür, dass im Main Thread etwas passiert?
dope791
User
Beiträge: 4
Registriert: Freitag 4. März 2022, 11:16

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.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
dope791
User
Beiträge: 4
Registriert: Freitag 4. März 2022, 11:16

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.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

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