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

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
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

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?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

OK, hast du ein anderen Ansatz für mich?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Das sieht schon sehr gut aus, aber geht das nur mit Python3.7?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sagt er doch - ab 3.5.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

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()
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Währe der Code so ok?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, so benutzt man asyncio. Die Einrückungen und die Benennung der Variablen sind nicht so ok.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

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.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

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.
:)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

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

Gruß, noisefloor
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ok dann werde ich es ab sofort beherzigen.
Warum ist das eigentlich suboptimal?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

OK vielen Dank.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten