Thread Stoppen /Killen ?

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
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Hi,

ich habe das problem, das meine threads, blockende sachen machen.
Leider blocken in seltenen Fällen die für ewig.

Deswegen funktioniert in dem falle eine schleife mit periodischer Stopvariable die man überprüft nicht.


Wie kann werde ich die Threads loswerden ?

Das ganze sollte auf Windows und Linux funktionieren, und der Thread der andere killen können muss, ist nicht der MainThread.


Danke schonmal für hinweise.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Threads killen kann man von Python aus nicht. Punkt, aus, Ende. Gibts nichts drüber zu diskutieren. (bevor jemand anfängt das zu diskutieren, was eine sehr beliebte Sache ist ;-))
--- Heiko.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann holen wir andere Sachen aus der Trickkiste und versuchen es mit denen: Greenlets. ;) Nur so ne dumme Idee, die mir um zwei Uhr in der nacht eingefallen ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

modelnine hat geschrieben:Threads killen kann man von Python aus nicht. Punkt, aus, Ende. Gibts nichts drüber zu diskutieren. (bevor jemand anfängt das zu diskutieren, was eine sehr beliebte Sache ist ;-))

Code: Alles auswählen

t = Thread()
t.start()
t._Thread__stop()
:twisted:
TUFKAB – the user formerly known as blackbird
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

blackbird hat geschrieben:
modelnine hat geschrieben:Threads killen kann man von Python aus nicht. Punkt, aus, Ende. Gibts nichts drüber zu diskutieren. (bevor jemand anfängt das zu diskutieren, was eine sehr beliebte Sache ist ;-))

Code: Alles auswählen

t = Thread()
t.start()
t._Thread__stop()
:twisted:

Funktioniert komischerweise nicht so richtig. Also das t.join() was normalerweise blockt kehr zurück, aber der p_thread vom os wird nicht freigegeben, ich sehe die threads bis zum kill vom python.

(Was natürlich auch bedeutet das die 1030 maximal möglichen threads irgendwann aufgebraucht sind.)
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Leonidas hat geschrieben:Dann holen wir andere Sachen aus der Trickkiste und versuchen es mit denen: Greenlets. ;) Nur so ne dumme Idee, die mir um zwei Uhr in der nacht eingefallen ist.

Interessant. Problem ist allerdings das das greenlet .switch() aufrufen muss wenn ich das richtig verstanden habe. Das kann es aber unter umständen nicht wenn es blockt oder ?


Um das problem ein bischen besser zu beschreiben:

Ich habe mehrere threads, diese bearbeiten in einem Worker-Pool aufgaben und führen verschiedene methoden der Aufgabenobjekte aus.
2 Methoden kehren in seltenen Fällen nie zurück (das eine ist ftplib wenn der ftpserver eine macke hat - connect geht aber fileupload hängt dann für immer ohne ein einzelnes byte zu übertragen).
Diese methoden möchte ich mit "@timeout(20)" dekorieren.


Ist das im Ansatz schon nicht machbar ?
Oder können da Greenlets, die ja wie Stackless Tasklets funktionieren sollen, helfen ?
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Das ist im Ansatz schon nicht machbar (mit Standard-Python-Funktionalität), Du kannst aber mal:

Code: Alles auswählen

import socket
socket.setdefaulttimeout(20)
ausprobieren, wenn beide Methoden die Du austimen willst Sockets benutzen. Alles andere was hier vorgeschlagen wurde sind endweder üble Hacks, oder sie funktionieren nicht richtig (oder sind nicht für CPython).

Deswegen: lass es sein da nach irgendwas zu suchen, und ich habs vorher auch schon prophezeit dass eine Diskussion anfängt, oder nicht? ;-)

Andere Möglichkeit: wenn's um Dateideskriptoren geht gibts immer noch select([fd],[],[],20), das allerdings nur unter Unix funktioniert... ;-)
--- Heiko.
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

modelnine hat geschrieben:Das ist im Ansatz schon nicht machbar (mit Standard-Python-Funktionalität), Du kannst aber mal:

Code: Alles auswählen

import socket
socket.setdefaulttimeout(20)
ausprobieren, wenn beide Methoden die Du austimen willst Sockets benutzen. Alles andere was hier vorgeschlagen wurde sind endweder üble Hacks, oder sie funktionieren nicht richtig (oder sind nicht für CPython).

Deswegen: lass es sein da nach irgendwas zu suchen, und ich habs vorher auch schon prophezeit dass eine Diskussion anfängt, oder nicht? ;-)

Andere Möglichkeit: wenn's um Dateideskriptoren geht gibts immer noch select([fd],[],[],20), das allerdings nur unter Unix funktioniert... ;-)

Cool wenn das funktioniert wäre das ftp lockup problem bestimmt gelöst.

select () gibts unter windows nur für INET sockets - passt in dem fall - nur hab ich die erfahrung gemacht das das mit vielen parallelen abfragen ziemlich viele verluste bei udp hat.
Antworten