Seite 1 von 1

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

Verfasst: Samstag 24. Januar 2015, 22:11
von erdmulch
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!"

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

Verfasst: Samstag 24. Januar 2015, 22:15
von EyDu
Dafür müsste sich c natürlich irgendwo in der Schleife auch mal ändern :wink:

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

Verfasst: Samstag 24. Januar 2015, 22:21
von erdmulch
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

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

Verfasst: Samstag 24. Januar 2015, 22:27
von Sirius3
@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.

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

Verfasst: Samstag 24. Januar 2015, 22:32
von /me
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.

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

Verfasst: Samstag 24. Januar 2015, 22:37
von erdmulch
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?

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

Verfasst: Samstag 24. Januar 2015, 22:40
von BlackJack
@erdmulch: Wie verändert denn eine *andere* Funktion das *lokale* `c` in der gezeigten Funktion‽

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

Verfasst: Samstag 24. Januar 2015, 22:58
von erdmulch
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')

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

Verfasst: Samstag 24. Januar 2015, 23:09
von 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.

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

Verfasst: Samstag 24. Januar 2015, 23:13
von erdmulch
ja, das verstehe ich, aber dies ist ja nur ein test
wie kann man sowas lösen?
wenn man die Sicherheitsaspekte ignoriert?

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

Verfasst: Samstag 24. Januar 2015, 23:29
von 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.

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

Verfasst: Sonntag 25. Januar 2015, 11:41
von garreth
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.

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

Verfasst: Sonntag 25. Januar 2015, 11:58
von Sirius3
@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.