Seite 1 von 1

während einer while schleife die nächste ausführen

Verfasst: Freitag 7. Dezember 2018, 16:12
von egon11
Hallo, ich stehe gerade vor einen Rätsel, also ich möchte genau gesagt wenn eine "while 1" Schleife läuft in einen Script aber schon die nächste ausführen.
Das Modul_x beinhaltet auch eine "while 1" Schleife.
Mein schema:

Code: Alles auswählen

import Modul_x

Modul_x.start()

while 1:
	anweisung 2
	
Kann man während Modul_x läuft schon das nächste ausführen? Ich habe es bis jetzt leider nicht geschafft.

Und dann habe ich festgestellt, wenn ich ein Modul importiere, das es sich beim Aufruf sich ausführt, schon ausführt wenn ich es importiere.
Warum ist das so?

Re: während einer while schleife die nächste ausführen

Verfasst: Freitag 7. Dezember 2018, 16:25
von __deets__
Diese Frage laesst sich so allgemein nicht beantworten. Nebenlaeufige Programmierung ist ein weites Feld, und was man da wie macht haengt stark von der konkreten Aufgabe ab.

Und wenn du entgegen dem, was hier immer gepredigt wird, zB von __blackjack__, ausfuehrbaren Code auf Modulebene hast, statt nur konstanten, Funktions und Klassendefinitionen - ja, dann wird das schon beim import ausgefuehrt.

Re: während einer while schleife die nächste ausführen

Verfasst: Freitag 7. Dezember 2018, 17:13
von egon11
Ich möchte z.B. 2 verschiedene LED's leuchten/blinken lassen.
Und da benötige ich 2 while-Schleifen.

Ich habe jetzt "Das thread-Modul" ins Auge gefasst, kurz probiert und funktioniert.

Code: Alles auswählen

from thread import start_new_thread
Import Modul_x

def schleife1():
	while 1:
		Anweisung 1
		
start_new_thread(Modul_x.start())
start_new_thread(schleife1())
Das Modul wird jetzt nur bei Tastendruck ausgeführt.

Wäre das so akzeptabel oder ist das nicht so das wahre?

Re: während einer while schleife die nächste ausführen

Verfasst: Freitag 7. Dezember 2018, 17:50
von __blackjack__
@egon11: Das `thread`-Modul ist nicht das wahre, das gibt's in Python 3 auch nicht mehr, weil man schon seit einer Ewigkeit auch in Python 2 schon das `threading`-Modul verwenden sollte. Threading grundsätzlich würde aber voraussetzen, das die Bibliothek/der Code den Du verwendest um die Hardware anzusprechen „thread safe“ ist. Wenn das nicht irgendwo deutlich steht, das Du zwei verschiedene LEDs auf unterschiedlichen Threads schalten darfst, wäre ich da skeptisch. Das Problem bei Fehlern bei Threadprogrammierung ist das man das nicht einfach ausprobieren kann. So ein Programm kann trotz Fehler ”funktionieren”. Bis es das dann mal nicht mehr tut.

Dein Beispielcode ist falsch, weil `start_new_thread()` ein Aufrufbares Objekt erwartet, und zumindest `schleife1()` nichts aufrufbares zurück gibt. Und ich vermute mal `Modul_x.start()` tut das ebenfalls nicht. Wenn man das richtig machen würde, stellt sich als nächstes die Frage was Du denkst was passiert wenn man zwei zusätzliche Threads startet und der Hauptthread dann am Ende angekommen ist. Falls Du das aus einer IDE heraus startest, solltest Du das dringend auch mal ohne IDE versuchen. Das verhält sich in solchen Fällen gerne mal anders.

Re: während einer while schleife die nächste ausführen

Verfasst: Freitag 7. Dezember 2018, 18:34
von egon11
OK, hast du ein anderen Ansatz für mich?

Re: während einer while schleife die nächste ausführen

Verfasst: Freitag 7. Dezember 2018, 18:55
von noisefloor
Hallo,
Ich möchte z.B. 2 verschiedene LED's leuchten/blinken lassen.
Wenn's auf dem Raspi ist -> einfach das gpiozero Modul nutzen.

Wenn du es mit Python 3 (>= 3.5) nebenläufig machen möchtest -> asyncio

Oder alles in eine Schleife packen.

Gruß, noisefloor

Re: während einer while schleife die nächste ausführen

Verfasst: Freitag 7. Dezember 2018, 21:04
von egon11
Das sieht schon sehr gut aus, aber geht das nur mit Python3.7?

Re: während einer while schleife die nächste ausführen

Verfasst: Freitag 7. Dezember 2018, 21:25
von __deets__
Sagt er doch - ab 3.5.

Re: während einer while schleife die nächste ausführen

Verfasst: Samstag 8. Dezember 2018, 10:11
von egon11
So jetzt habe ich es mal getestet, es scheint genau das richtige zu sein.
Hier mal ein kleines Script, was 2 dauer while-Schleifen durchläuft.
Sobald bei der Funktion die "probe2()" die datei.txt vorhanden ist gibt es mir auch das entsprechende aus.
Hier mal mein Code für euch Profis ob das so ok ist:

Code: Alles auswählen

#!/usr/bin/python3.5

import asyncio
import os


async def probe1():
    while True:
        print("probe1")
        await asyncio.sleep(0.5)

async def probe2():
        c = "nicht vorhanden"
        dd = "/home/dell/datei.txt"
        while True:
            print(c)
            if os.path.exists(dd):
                c = "datei vorhanden"
            await asyncio.sleep(0.5)


async def main():
    a = probe1()
    b = probe2()
    await asyncio.wait([a, b])


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 12:33
von egon11
Währe der Code so ok?

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 12:37
von Sirius3
Ja, so benutzt man asyncio. Die Einrückungen und die Benennung der Variablen sind nicht so ok.

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 15:10
von egon11
Sirius3 hat geschrieben: Sonntag 9. Dezember 2018, 12:37 Die Einrückungen und die Benennung der Variablen sind nicht so ok.
Meinst du die vor if, async u.s.w.?
Wenn ja dann ist das nur durch das kopieren gekommen.

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 15:26
von __deets__
Wenn das durch das kopieren zu Stande gekommen ist, dann deutet das immer noch darauf hin, dass dein Editor schlecht konfiguriert ist. Denn dann hast du mal Tabs und mal Spaces gemischt. Das solltest du dringend abstellen, sonst bekommst du da mal probleme.

Und die Benennung mit durchnummerierten Funktionen, und a und b, ist halt auch schlecht. Kann keiner verstehen. Und keiner bist auch du in wenigen Wochen oder Tagen, wenn du wieder auf deinen eigenen Code schaust.

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 15:54
von egon11
Ich ich habe mir angewöhnt immer mit Tabs bei den Einrückungen zu arbeiten, pro Einrückung 1 Tab.
Wenn ich "richtige" Scripte schreibe, dann benenne ich sie auch anders, das war jetzt bloß ein kurzes Beispiel.
Vielen dank für die Hinweise.
:)

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 15:58
von noisefloor
Hallo,

das mit den Tabs ist suboptimal. Die klare Empfehlung ist, _immer_ mit 4 Leerzeichen pro Einrückungsebene zu arbeiten.

Gruß, noisefloor

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 16:44
von egon11
Ok dann werde ich es ab sofort beherzigen.
Warum ist das eigentlich suboptimal?

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 17:02
von noisefloor
Hallo,

technisch, also für den Python Interpreter, ist es egal. Aber die PEP8, also der heilige Gral des Stils der Python-Programmierung, empfiehlt klar vier Leerzeichen: https://www.python.org/dev/peps/pep-0008/#indentation

Man kann übrigens so gut wie jeden Editor so einstellen, dass bei Druck auf die Tab-Taste vier Leerzeichen eingefügt werden (statt ein Tab).

Gruß, noisefloor

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 17:13
von egon11
OK vielen Dank.

Re: während einer while schleife die nächste ausführen

Verfasst: Sonntag 9. Dezember 2018, 17:20
von __deets__
Der Grund ist ganz einfach: du als Mensch siehst nicht, ob etwas Leerzeichen oder Tabs sind. Der Interpreter aber sehr wohl. Und wenn etwas SICHTBAR 8 Leerzeichen eingerueckt ist als Block, kann es trotzdem eine Mischung aus 8 Leerzeichen und 1 oder 2 Tabs sein. Oder 4. Oder 8. Je nachdem, wie weit du den Tababstand eingestellt hast. Und damit ist trotz visueller Kongruenz aus Sicht des Python-Interpreters keine Entschedung darueber faellbar, ob die Zeilen zu einem Block gehoeren sollen oder nicht. Und dann kracht es. Mischen von Tabs und Leerzeichen ist also schonmal Mist.

Und weil wie schon gesagt Tabs so unterschiedlich dargestellt werden koennen, und der Code dann ploetzlich ganz anders aussieht, weil jemand da dran rumgedreht hat - da hat man dann empfohlen, 4 Spaces zu benutzen.