threads in IDLE

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
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Montag 25. Juni 2007, 07:23

Hallo,
ich komm immer noch mit den threads nicht so richtig klar - folgendes script stürzt ab, und zwar immer in der fünften Runde des Threads, aber anscheinend nur, wenn ich es von IDLE aus in der Python-shell laufen lasse. Wenn ich es in der dos-box starte, scheint es ok zu laufen.
Würde es aber na klar auch gern in der Python-shell zum laufen kriegen, weil da das debuggen einfacher ist...

PS ich weiss gar nicht ob 'stürzt ab' ier richtig ist - es gibt keine Exception oder so, es ist einfach völlig tot. :(

Code: Alles auswählen

import thread
import random
import time

class database:
    def __init__(self, username=0, password=0):
        self.threadLock = thread.allocate_lock()
        self.markets = list()

    def getMarkets(self):
        for i in range(1,25):
            DB_newMarket = market(self.threadLock)
            DB_newMarket.marketId = random.randint(10000,99999)
            DB_newMarket.marketStatus = "OPEN"
            self.markets.append(DB_newMarket)
                
class market:
    def __init__(self, threadLock):
        self.threadLock = threadLock
        self.marketId = int()
        self.marketStatus = str()
        
    def marketUpdate(self):
        self.marketId = random.randint(10000, 99999)
        self.marketStatus = "OPEN"
        return self.marketStatus != "CLOSED"
    
    def marketThread(self, timer):
        
        def _mthread(timer):
            isOpen = True
            while isOpen:
                self.threadLock.acquire()
                isClosed = self.marketUpdate()
                print "marketUpdate returned,", self.marketId
                self.threadLock.release()
                time.sleep(timer)
            print "thread finished"
            
        thread.start_new_thread(_mthread, (timer, ))

a = database()

a.getMarkets()

a.markets[0].marketThread(5)
while 1==1:
    time.sleep(1)
    a.markets[0].threadLock.acquire()
    print "tick"
    a.markets[0].threadLock.release()
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Montag 25. Juni 2007, 10:04

jo_hb hat geschrieben:Würde es aber na klar auch gern in der Python-shell zum laufen kriegen, weil da das debuggen einfacher ist...
Hi Jo,

was bringt es, ein Programm mit mehreren laufenden Threads im IDLE-Debugger zu überwachen? Soviel ich weiß, stoppt der Debugger die laufende Abarbeitung um die aktuellen Werte der Variablen anzuzeigen. Er kann ja nicht alle Threads stoppen und dann ihren Ablauf simulieren, denn das "gleichzeitige" Ablaufen der Threads ist ja ihr eigentlicher Sinn. Und einen Thread zu blockieren während alle anderen laufen halte ich in diesem Zusammenhang auch für wenig sinnvoll.

Tut mir leid, wenn Dich diese Meinung nicht weitergebracht hat.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 25. Juni 2007, 12:00

Versuch mal, die print-Statements durch kritische Abschnitte zu schützen (oder gleiche eine print-ähnliche Methode die diese Aufgabe übernimmt). Das löst oft schon die schlimmsten Probleme mit IDLE und Multithreading.
Antworten