Main thread

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
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo,

Meine Situation:
Ich habe eine Funktion gebaut.
Diese möchte ich 'normal' aufrufen oder über einen thread starten.
Wie kann ich innerhalb der Funktion herausfinden ob ich mich im Main-Thread befinde oder nicht?
Gruß, Harry
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich bin mir zwar nicht sicher ob es einen Unterschied macht, aber: nutzt du 'thread' Threads, oder welche von 'threading'?
Bin gerade am Spielen mit threading.enumerate()..
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hi,

Ich benutze thread.start_new_thread(...)
Gruß, Harry
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

wie wärs so:

Code: Alles auswählen

def dummy(My_Value, By_Thread = False):
    pass
Wenn du die Funktion als Thread startest setzt du By_Thread auf True.

Hab schon lange nichts mehr mit Threads gemacht, aber sollte funktionieren.

MfG
Andreas
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Okay. Ich habe nach etwas spielen festgestellt, dass es egal ist, was das für Threads sind. Ich habe das so gelöst:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 
import thread, threading, time

def test(wait):
    time.sleep(wait)
    isthread = threading.enumerate()[0] is not threading.currentThread()
    print "Called from a thread: %s" % str(isthread)

test(1)
thread.start_new_thread(test, (2,))
time.sleep(4)
Also, wir brauchen erstmal das low-level thread, dann noch das high-level threading. time nehme ich nur, damit der Mainthread sich nicht vor dem zweiten Thread verabschiedet. Dann haben wir test(), dem es egal ist, ob man es aus dem Mainthread oder woandersher aufruft. Nun, jetzt gabe es zwei Möglichkeiten: entweder test() beim starten thread=True mit angeben, aber das ist ja nicht sehr elegant. Deswegen gucken wir mal per threading: threading.enumerate()[0] zeigt auf den Mainthread, es zeigt alle gestarteten Threads an, und Main sollte immer der erste in der Liste sein. Danach vergleichen wir, ob es threading.currentThread() ist. Finito!

Edit: Die erste, imho weniger elegante Lösung hat XT@ngel gerade gepostet, als ich den Text geschrieben habe.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Danke für eure hilfreichen Antworten!
Gruß, Harry
Antworten