Seite 1 von 1

Main thread

Verfasst: Freitag 21. Januar 2005, 13:09
von HarryH
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?

Verfasst: Freitag 21. Januar 2005, 14:00
von Leonidas
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()..

re:

Verfasst: Freitag 21. Januar 2005, 14:03
von HarryH
Hi,

Ich benutze thread.start_new_thread(...)

Verfasst: Freitag 21. Januar 2005, 14:11
von XT@ngel
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

Verfasst: Freitag 21. Januar 2005, 14:12
von Leonidas
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.

re

Verfasst: Montag 24. Januar 2005, 08:32
von HarryH
Danke für eure hilfreichen Antworten!