If c == 1 start, if c==0 stop

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
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo Forum,

ich habe ein kleines Problem.
wenn c=1 ist, soll ein zähler im Sekunden Takt hochzählen
dies soll er solange machen bis c=0 ist.

leider bricht bei mir der Zähler nicht ab.
Kann mir jemand sagen warum?

vielen Dank im voraus

Code: Alles auswählen

def counter(a, b):
    
    x = 0
    c = a+b

    while c == 1:
        if c == 2:
            break
        print x
        time.sleep(1)
        x = x + 1
        
    else: # Wenn die Bedingung das erste mal False ergibt
        print "Fertig!"
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dafür müsste sich c natürlich irgendwo in der Schleife auch mal ändern :wink:
Das Leben ist wie ein Tennisball.
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

c wird sich in der schleife nie ändern...
wie würdet ihr das Problem beheben?
wie gesagt, ich möchte x solange um eins erhohen bis c = 2 ist
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@erdmulch: Was willst Du denn machen? Unter welcher Bedingung soll sich denn c ändern? Das mußt Du doch wiseen, und brauchst uns nicht zu fragen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

erdmulch hat geschrieben:c wird sich in der schleife nie ändern...
wie würdet ihr das Problem beheben?
Dann hast du gar kein Problem sondern ganz einfach eine Endlosschleife.
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

c kann sich ändern und zwar ist dies ein funktionsaufruf in einer anderen funktion.
Ich will nur, dass wenn c=2 ist, damit dann der zähler gestoppt wird.
Ist sowas nicht möglich?
BlackJack

@erdmulch: Wie verändert denn eine *andere* Funktion das *lokale* `c` in der gezeigten Funktion‽
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

so wird die variable c geändert:

Code: Alles auswählen

def v_start(request):
    counter(0, 1)
    return render(request,'test/index.html')

def v_stop(request):
    counter(1, 1)
    return render(request,'test/index.html')
BlackJack

@erdmulch: Nein so wird sie ganz sicher nicht geändert. Du startest damit bloss eine zweite Endlosschleife in einem anderen Funktionaufruf der natürlich seine eigenen lokalen Namen hat.

Und bei Webprogrammierung hast Du gleich noch einen ganzen Haufen anderer Probleme an der Backe wenn Du da über Webanfragen hinweg etwas ”laufen” lassen möchtest, denn im Regelfall ist nicht garantiert dass Daten von dem einen Aufruf auch im nächsten Aufruf noch verfügbar sind. Wenn da etwas persistent sein soll wird es deshalb üblicherweise in eine Datenbank geschrieben.
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

ja, das verstehe ich, aber dies ist ja nur ein test
wie kann man sowas lösen?
wenn man die Sicherheitsaspekte ignoriert?
BlackJack

@erdmulch: Das hat an der Stelle nichts mit Sicherheit zu tun, das sind einfach die technischen gegebenheiten mit denen man zu tun hat. Ein Funktionsaufruf führt dazu das der Code der Funktion jedesmal ”frisch” ausgeführt wird, also in einem eigenen lokalen Namensraum. Wenn sich Funktionsaufrufe der gleichen Funktion in der Ausführung ”überlappen”, sei es weil die Funktion rekursiv aufgerufen wird, oder sei es weil sie nebenläufig in einem anderen Thread aufgerufen wird, dann werden die Funktionen unabhängig voneinander ausgeführt und eine Zuweisung an einen Namen in einer Ausführung hat keinen Einfluss auf den gleichen Namen in einer anderen Ausführung. Das gäbe auch ein ziemliches durcheinander wenn das so wäre und rekursive Funktionen wären nicht so einfach möglich. Das hat bis jetzt alles noch nichts mit Webprogrammierung zu tun.

Was die noch dazu ins Spiel bringt sind mehrere Threads. Mindestens, denn es könnten auch Prozesse sein, und sogar beides: mehrere Prozesse die jeweils mehrere Threads ausführen. Und wenn man gegen diese Randbedingungen programmiert, dann muss die Persistenz irgendwie ausserhalb des oder der Prozesse mit der Webanwendung gelöst werden. Wie gesagt: üblicherweise in einer Datenbank. Man könnte dort zum Beispiel beim starten die aktuelle Uhrzeit hinterlegen und beim stoppen dann ausrechnen wieviele Sekunden seit dem vergangen sind.
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

Hallo erdmulch,

ich habe da eine kleine Idee. Leider bin ich noch blutiger Anfänger und kenne mich mit Threads noch nicht so gut aus. Ich hätte den Vorschlag, wenn du das so machen willst, mach ein Objekt daraus. So kannst du von außen auf die bestehende Instanz der laufenden Klasse counter zugreifen.

Code: Alles auswählen

from time import sleep

class counter(object):
    timeout = 200
    def __init__(self, a, b):
        self.x = 0
        self.a = a
        self.b = b
        self.c = a+b
    def run(self):
        while self.c == 1:
            print(self.x)
            sleep(1)
            self.x += 1
            if self.x == self.timeout:
                return 'Timeout'
        else:
            return 'Fertig!'
Da ich noch keine Ahnung von Threads habe, kann ich nicht überprüfen ob das so funktioniert wie ich mir das vorstelle und ich hoffe, dass es nicht komplett am Thema vorbei geht.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@garreth: Du hast keinen Thread gemacht, sondern einfach ein Objekt mit einer run-Methode. Der Rückgabewert von Threads wird auch nicht weiter beachtet, weil wohin soll denn auch etwas zurückgegeben werden, wenn der Aufrufer gar nicht auf das Ergebnis wartet.

Große Webseiten werden normalerweise horizontal skaliert, das heißt, die Anfragen werden nicht von einem Programm alle alleine beantwortet, sondern es gibt viele Server auf denen jeweils das gleiche Skript lauft, die jeweils eine Anfrage nehmen, und sie beantworten. Damit ist nicht mehr gegeben, dass der selbe Prozess sowohl den start- als auch den stop-Request bekommt. Wäre das Problem gelöst, kommst das nächste Problem, dass auf viele start gar kein stop folgt, weil jemand die Seite einfach zumacht, sie neu lädt, oder irgendetwas anderes passiert. Damit würden etliche Threads gestartet ohne dass sie wieder beendet werden. Ein System wäre sehr schnell überlastet, ein unbeabsichtigter DoS-Angriff.
Antworten