Frage zu Threads!

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.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 25. November 2006, 17:06

Hallo!

Ich wollte mal fragen, ob man einzelne Threads an Namen koppeln kann?

Also, das ich einen Thread starte, das ganze sofort an einen Namen (oeder eine ID?) koppele.

So, dass ich dann explizit diesen einen Thread anhand der ID oder dem Namen beenden kann.

Ist so etwas möglich?


MfG EnTeQuAk
Zuletzt geändert von EnTeQuAk am Dienstag 28. November 2006, 17:25, insgesamt 1-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 25. November 2006, 18:59

Du kannst Threads nicht extern beenden, daran scheitert es. Es hält dich aber keiner ab, eine Liste oder ein Dict mit Threads zu haben, Threads sind ja auch nur Objekte ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 25. November 2006, 19:58

Du kannst Threads nicht extern beenden
Ich glaub, ich sollte mich mehr mit Threads beschäftigen.

Oder ich drücke mich nur doof aus :)

Also geht es nicht, einen Server (in meinem Fall den BaseWSGIServer.py von wsgiarea.pocoo.org) in einem eigenen Thread zu starten und dann anhand des Namens (was ja geht *freu*) beenden kann.

Ich hab zwar schon in etwa ne Lösung hier im Forum gefunden allerdings muss ich da erstmal durchsteigen... Ma schaun.

Danke erstmal!

MfG EnTeQuAk
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 25. November 2006, 20:59

EnTeQuAk hat geschrieben:Also geht es nicht, einen Server (in meinem Fall den BaseWSGIServer.py von wsgiarea.pocoo.org) in einem eigenen Thread zu starten und dann anhand des Namens (was ja geht *freu*) beenden kann.
Ein Thread kann sich nur selbst beenden. Dazu musst du ihm eine Möglichkeit geben, auf "Beende dich"-Befehle des Hauptprogramms zu reagieren.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 25. November 2006, 22:19

Ahhh! :D Das ist gut. Wunderbar da hast du mich auf eine Idee Gebracht :D



EDIT:

Danke Leonidas!
So, wie ichs mir gedacht habe gehts nun. :)

Threads können wirklich kompliziert sein, wenn man keine Ahnung davon hat.


MfG EnTeQuAk
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 25. November 2006, 23:16

Was mir noch grad einfällt.


Gibt es irgenteine Funktion, einen Thread zu pausieren?


Das würde mich um einiges erleichert... :)


MfG EnTeQuAk
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 25. November 2006, 23:27

Was meinst du mit Thread pausieren? Einen Thread musst du ähnlich wie einen abgekappselten Prozess ansehen, du kannst ihn kaum von außen beeinflussen. Ein Thread kann sich zwar pausieren, mit time.sleep() zum Beispiel, aber das muss er selbst machen, von außen aus dem Hauptthread geht das nicht direkt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Dienstag 28. November 2006, 13:00

Dann habe ich noch eine Frage.

Ich hab mir was gaaaanz kleines gebastelt. Aber es geht einfach nicht.

Wenn ich den Thread in folgendem Script:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from colubrid import RegexApplication, execute, HttpResponse
import system
import thread
from sys import argv


def start_server():
    thread.start_new_thread(execute(app=system.daucms, port=8080), ())
    print 'Server gestartet'

def stop_server():
    thread.exit()
    print 'server gestoppt'

try:
    argv[1]
    if argv[1].lower() == 'start':
        start_server()
    elif argv[1].lower() == 'stop':
        stop_server()
except IndexError:
    print 'Bitte start oder stop angeben!'
Nun mit '' server_start() '' starte. Startet er den Server. Aber müsste dann nicht die Konsole wieder benutzbar werden?
Wie kann ich es machen, das der Thread wirklich im Hintergrund startet und die Konsole nach dem aufruf von '' python daucms.py start '' benutzbar wird?


MfG EnTeQuAk
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

Dienstag 28. November 2006, 13:30

Kannst du nicht. Du verwechselst da Python und die Shell in der es läuft.
Wenn du ein Python Programm startest, dann läuft es und übernimmst stdin/stdout von der Shell und gibt sie erst wieder zurück, wenn du das Programm beendest, und zwar nur dann.

Eine möglichkeit, allerdings nur unter Linux, wäre das Programm über "python <script> &" zu starten. Dann wird das Programm in den Hintergrund geschickt, allerdings landen ausgaben immernoch auf der Shell.
Eine andere möglichkeit wäre "pythonw" als interpreter zu benutzen, der startet das ganze unanhängig bon der Shell (das Programm läuft also auch weiter, wenn die Shell geschlossen wird, in den anderen Fällen sind es nur Subprozesse der Shell). Allerdings hast du dann keine Möglichkeit Konsolenaus-/eingaben zu tätigen.

/: Ein Python Thread ist kein richtiger, einzelner Thread des Betriebssystems, sondern nur Pythonintern.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Dienstag 28. November 2006, 13:40

/: Ein Python Thread ist kein richtiger, einzelner Thread des Betriebssystems, sondern nur Pythonintern.

DAS sagt mir alles :)


Herzlichen Dank Blattlaus! :D

Nun weiß ich, wie ichs machen müsste.. .:D

Oki. Ma schaun...
BlackJack

Dienstag 28. November 2006, 14:58

Das ist'ne Falschinformation. "Python Threads" sind "richtige Threads". Und Threads sind auch immer nur "intern" d.h. in dem Prozess bekannt von dem aus sie gestartet wurden.
prof_weirdo
User
Beiträge: 38
Registriert: Donnerstag 2. Februar 2006, 11:27
Wohnort: Bei Osnabrück

Dienstag 28. November 2006, 15:12

Also ich bin mir auch recht sicher gelesen zu haben das Python Threads eben
keine Threads auf Kernelebene sind, sondern über eine entsprechende Bibliothek nur Pythonintern existieren.

P.S.: Werd nochmal nachschauen ob ich das wiederfinde und evtl. mit Quellenangabe posten.
Zuletzt geändert von prof_weirdo am Dienstag 28. November 2006, 15:34, insgesamt 1-mal geändert.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Dienstag 28. November 2006, 15:21

Oke :) hier halt ich mich raus :D

MIr reichts eigentlich schon, das die nur "intern" bekannt sind. Davon geh ich einfach mal aus. Wenns net geht... :) Ach wird scho! :D

Wobei ich es mal ausprobiert habe. Ich habe mir nen Thread gebastelt und ma in meine Systeminformationen geschaut.

Der heißt immer "python". Gut... nun weiß ich net, ob wenn die "einzelne" Threads sind man denen nen eigenen Namen zuweisen kann. Aber ausgetestet hab ichs. immer "python". hmm... hat das was zu sagen?
(OS: Ubuntu Edgy Eft)


MfG EnTeQuAk
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

Dienstag 28. November 2006, 15:36

Ne, das ist normal. Schließlich wird der Python Code bloß interpretiert und der Interpreter ist nunmal "python". Deswegen ist es aus Kernelsicht eben der Prozess "python" und nicht mehr. Den Namen ändern...naja, du könntest den Interpreter umbenennen, allerdings gehe ich davon aus, dass es dann zumindest zu ein paar Problemen kommt ;)
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Dienstag 28. November 2006, 16:07

Hi Hi :() durchaus.. :D
Antworten