Auslastung durch Skript - sleep sollte passen.

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ja ich weis das wurde schon öfter gepostet ;)

    Allerdings fand ich über die SuFu nur Beiträge bei denen der Fehler bei einem falsch gesetzten time.sleep lag.

    Ich habe folgendes skript (vereinfacht dargestellt) am laufen:

    Code
    while True:
      if GPIO.event_detected(7) or xxx or xxx or xxx or xxx or xxx or xxx:
        print "button pressed"
      time.sleep(0.2)

    xxx ist ein weiteres GPIO.event_detected(x)
    Habs nur rausgekürzt, weil sonst die Zeile hier in der Darstellung zu lange ist.
    Insgesamt sind das also 7 GPIOs bei denen auf ein event gewartet wird.

    Auslastung rennt ans maximum.

    Ist das mit 0.2 sek wirklich schon zu viel?

    Oder ist einfach nur das Abfragen der GPIOs sehr "anstrengend" für den kleinen?

  • Wenn du z. B. folgendes meinst:

    Code
    while True:
      def btUP():
        pass
    
    
      GPIO.add_event_detect(7, GPIO.FALLING, callback = btUP, bouncetime = 300)

    dann... nein ^^

    werde ich gleich morgen mal testen... heute ist es mir zu spät ^^

  • hab das ganze jetzt ohne "while" wie folgt umgesetzt:

    Das arbeitet soweit prima aber die Auslastung ist immernoch bei 100%...

    Ich denke allerdings, dass ich den Fehler jetzt gefunden habe.

    Ich muss mehrere schleifen paralell laufen lassen, weshalb ich "thread" nutze.

    also

    Code
    thread.start_new_thread(controler, ())

    Problem dabei ist, dass ich dafür eine Dauerschleife am Ende des Skripts nutzen muss.

    Code
    while True:
      pass

    Gibt es hier eine bessere Möglichkeit threads zu nutzen?
    Oder kann ich in die Dauerschleife am Schluss bedenkenlos ne kleine Pause einbauen?

  • Wofür hast du mehrere Schleifen? Wenn möglich dann so gut es geht auf Schleifen verzichten.

    Ein Beispiel:

    Spoiler anzeigen


    Bitte poste mal dein vollständiges Script

  • Ich benötige 1 Schleife zum Auslesen meines GSM-Modules (def phone () - hier noch leer, bin noch nicht fertig) eine für die GUI (is ja quasi nix anderes wie ne schleife), eine um via SPI den MCP3208 aus zu lesen und bis eben hab ich für das Auslesen der 7 GPIOs auch eine Schleife verwendet.

  • Da hast du eine menge Fehler drinnen, insbesondere was Einrückungen betrifft aber das mag Python absolut nicht.

    def controler():
    Da steht nichts drin. Es bringt also nix dafür ein Thread zu starten.

    def readSensors():
    Da fehlt die Einrückung bei den 2 nachfolgenden Zeilen.

    def createGUI():
    Da fehlt ebenfalls die Einrückung der 3 nachfolgenden Zeilen.

    def listfill():
    Da fehlt bei den for Schleifen glaub ich auch ein weiteres Leerzeichen, es müssen mein ich immer mind. 2 Leerzeichen als Einrückung sein eines reicht Python nicht (imho)

    def phone()
    Da fehlt ebenfalls eine Einrückung aber auch der Doppelpunkt nach phone()

    def openThreads():
    Da fehlen ebenfalls die Einrückungen

    while True:
    Und hier fehlt ebenfalls die Einrückung..

    def openThreads():
    Und hier startest du die Threads gar nicht.. Sie laufen also dann auch nicht weil .start() nicht aufgerufen wird. Orientier dich dabei mal an meinem Beispiel oben im Spoiler.

  • nein da hats mir wieder die leerzeichen raus... habs aber aus IDLE 1 zu 1 kopiert -.-

    Die leerzeichen sind vorhanden und passen, es funktioniert alles wunderbar. Das Problem ist nur die Auslastung die dur die letzte while Schleife entsteht.

    Noch ein Kopier-Versuch. Die Vorschau zeigt alles richtig an. Wenns wieder nicht geklappt hat, einfach die Leerzeichen ignorieren, die sind bei mir richtig. Mehr als copy paste aus IDLE kann ich leider nicht tun -.-

    Edit: so, habs jetzt manuell überarbeitet und immer 2 statt 1 Leerzeichen verwendet, jetzt müsste die Darstellung passen

    Einmal editiert, zuletzt von Nueffe (3. September 2014 um 19:09)

  • Es fehlt aber immer noch ein Doppelpunkt in der def phone() Zeile ;)

    Und wie gesagt brauch man am Ende keine Dauerschleife wegen Threads. Die halten sich selber. Das Script selber ist ein Thread und das kann normal bis ans Ende laufen, hauptsache du startest vor Ende des Scripts die anderen Threads - das sind dann sozusagen weitere Scripts die dann im Hintergrund laufen.

    Versuch das ganze also mal bitte wie folgt:

    ..hab mir erlaubt mal die ganzen Leerzeilen raus zu nehmen damit man die Zusammenhänge und Einrückungen besser erkennt..

  • Deine Version funktioniert super, lediglich das .serve_forever beim Erstellen der Threads musste ich raus nehmen.
    Aber auf jeden Fall werde ich so weiter macher.

    Auslastung dümpelt jetzt irgendwo unter 20% rum ;)

    Danke :)

    Einmal editiert, zuletzt von Nueffe (4. September 2014 um 18:39)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!