Seite 1 von 1

threads in IDLE

Verfasst: Montag 25. Juni 2007, 07:23
von jo_hb
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()

Re: threads in IDLE

Verfasst: Montag 25. Juni 2007, 10:04
von Michael Schneider
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

Verfasst: Montag 25. Juni 2007, 12:00
von EyDu
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.