Python und CPU Load

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo!

    Habe jetzt auch eine rPI. :D Dazu habe ich nach einer Anleitung einen Switch zum Herunterfahren zusammengebaut.

    Wenn ich jedoch das python Script ausführe habe ich stetig 95% CPU Load.

    Das Script sieht wie folgt aus:


    Code
    import RPi.GPIO as GPIO
    import time
    import os
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(17, GPIO.IN)
    while True:
            if(GPIO.input(17)):
                    os.system("sudo shutdown -h now")
                    break
    time.sleep(1)

    Hat jemand eine Idee, wie ich die CPU Load runterbekomme?

    Grüße

    Thosch

  • Für die dauerhafte Tastenabfrage ist Dein Verfahren nicht wirklich geeignet. Du fragst ständig den Eingang ab, das kostet recourcen. Sinnvoller ist es, einen Interrupt zu setzen, der Dein Programm startet wenn eine Taste gedrückt wird.
    Das geht nur leider in Python nicht.
    Wenn Du etwas C kannst, schau Dir mal die Interrupt-Funktion in der WiringPi-Library an.

  • Ich nehme an, dass du den Aufruf von "time.sleep(1)" eigentlich innerhalb der Schleife (und nicht hinterher) aufrufen wolltest, oder? Dafür musst du es auf dieselbe Einrückungstiefe bringen, wie die GPIO-Abfrage.

    Derzeit wird deine Schleife ohne Unterlass wiederholt und verbraucht somit soviele CPU-Takte, wie der Prozess sich vom Betriebssystem holen kann. Der "sleep"-Aufruf dagegen übergibt die Kontrolle für die angegebene Zeit zur freien Verteilung an den Kernel zurück.

  • Zitat von arbofaktur.de pid="4620" dateline="1359154252"


    Ich nehme an, dass du den Aufruf von "time.sleep(1)" eigentlich innerhalb der Schleife (und nicht hinterher) aufrufen wolltest, oder? Dafür musst du es auf dieselbe Einrückungstiefe bringen, wie die GPIO-Abfrage.

    Hi!

    Danke genau daran lag es.

    Dieser Code funktioniert:

    Code
    import RPi.GPIO as GPIO
    import time
    import os
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(17, GPIO.IN)
    while True:
            if(GPIO.input(17)):
                    os.system("sudo shutdown -h now")
                    break
            time.sleep(1)
  • Klar ist der Bullshit. Aber er erfüllt erstmal seinen Zweck.

    Aber nur zu schreiben, der Code ist Bullshit könnte man mit demjenigen vergleichen, der wirklich alle 2 Sekunden die Tür aufmacht, um zu gucken, ob einer da ist.

    Bin für jeden Vorschlag dankbar..

    Einmal editiert, zuletzt von thosch (26. Januar 2013 um 23:42)

  • Zitat von thosch pid="4668" dateline="1359240023"


    Klar ist der Bullshit. Aber er erfüllt erstmal seinen Zweck.

    Effizientere Lösungen gibt es natürlich immer - aber wenn dein Code-Vorschlag dein spezifisches Problem löst, dann würde ich mich von der Existenz möglicher Alternativen nicht beirren lassen. Wenn es dir allerdings um den Lerneffekt geht, dann ist das natürlich etwas anderes.


    Zitat

    Wie ich schon weiter oben sagte, kannst du es ja mal mit inotify bzw. für Python pyinotify ausprobieren.
    http://pyinotify.sourceforge.net/

    Spontan wäre ich mir nicht sicher, dass das GPIO-Kernelmodul die entsprechenden Ereignisse auslöst, auf denen inotify basiert. In der inotify-FAQ steht dazu allgemein folgendes:

    Zitat

    Some filesystems (e.g. procfs or some network filesystems) don't emit events in some cases.

    Wie auch immer: viel Spaß beim Experimentieren!

  • an dem CPU-Last Problem knabbere ich aktuell auch und finde es nervig, dass man sich da jetzt - nach mühseligen Einstieg - in C einarbeiten muss. Mit inotify habe ich schon mehrere Erfahrungen machen können und werde da mal versuchen mit zu tricksen.

Jetzt mitmachen!

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