threading Problem

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
mistered
User
Beiträge: 7
Registriert: Montag 27. Februar 2023, 18:43

Hallo,
ich bin neu hier und bastel gerade an meinem ersten Python/Pi Projekt. Es geht hauptsäachlich darum, 2 Motoren mit Hallsensoren so ca alle 10min eine vorher berechnete Anzahl Umdrehungen machen zu lassen. Nun bin ich gerade an der Stelle, wo die Motoren laufen und eben nach x Umdrehungen wieder stoppen oder langsamer werden sollen. Leider kann ich normal nicht gleichzeitig mitzählen und dden Motor laufen lassen. Ich denke, dazu brauch ich das Threading. Nun hab ich mich umgeschaut und verschiedene Anleitungen gelesen und versuche nun, ein Beispielskript zum laufen zu bekommen, um dann meine Steuerung zu bauen. Hier is jetzt das Problem, das Script läuft in Thonny einwandfrei, aber in der Shell auf dem Pi scheinbar nicht. Die Zeilen, die die Threads erzeugen sollen, erscheinen nicht, aber der print Befehl am Ende des Scripts wird ausgeführt. Ich habe Python 3.9 installiert, der Pi ist ein 3B.
Hier nun das script:

import time
import _thread

def thread_test(name, wait):
i = 0
while i <= 3:
time.sleep(wait)
print("Running %s\n" %name)
i = i + 1

print("%s has finished execution" %name)

if __name__ == "__main__":
_thread.start_new_thread (thread_test, ("First Thread", 1))
_thread.start_new_thread (thread_test, ("Second Thread", 2))
_thread.start_new_thread (thread_test, ("Third Thread", 3))
print("Los gehts")

Wo kann das Problem liegen? Ich als Anfänger weiss da nich richtig weiter.

Alternativ hab ich noch ein anderes Script mit dem Modul threading, aber das macht nur Fehlermeldung:
sunny@raspberrypi:~ $ python3 /home/sunny/ST/Threadtest.py
Traceback (most recent call last):
File "/home/sunny/ST/Threadtest.py", line 4, in <module>
class threadtester (threading.Thread):
AttributeError: module 'threading' has no attribute 'Thread'
Exception ignored in: <module 'threading' from '/home/sunny/ST/threading.py'>
AttributeError: module 'threading' has no attribute '_shutdown'
Is aber ein anderes Problem

Vielen Dank erstmal
Ed
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Das _thread-modul ist ein Implementierungsdetail vom threading-Modul. Durch den führenden Unterstrinch ist es als Implementierungsdetail gekennzeichnet uns sollte deswegen nicht verwendet werden. Statt dessen sollte man das thread-Modul verwenden. Wenn man die Python-Dokumentations von oben nach unten durchgeht, stößt man zuerst auf das threading-Modul, nicht das _thread-modul. Warum lesen Anfänger immer von unten nach oben? Ist das irgendein kosmisches Gesetz, das sich hier zeigt, und das verhindert, dass sie das threading-Modul verwenden?

Du hast deine Datei threading.py genannt. Damit überdeckst du den Namen des threading-Moduls aus der Standardbibliothek.

Hab ich eigentlich schon geschrieben, dass du das threading-Modul verwenden sollst, statt dem _thread-Modul?
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, das Skript ist halt schon wieder zu Ende, bevor der erste Thread überhaupt etwas ausgeben kann. Dass Thonny Python-Skripte nicht sauber in einem eigenen Prozess laufen läßt, sondern dass es da Wechselwirkungen mit der IDE gibt, ist dessen Problem. Solche Schrott-Editoren gehören sofort in die Tonne.

Statt einer while-Schleife würde man eine for-Schleife benutzen. Unter if-__name__ sollte nur der Aufruf der main-Funktion stehen. _thread benutzt man nicht. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 3.

Code: Alles auswählen

import time
import threading

def thread_test(name, wait):
    for i in range(4):
        time.sleep(wait)
        print(f"Running {name}")
    print(f"{name} has finished execution")

def main():
    threads = [
        threading.Thread(target=thread_test, args=(f"{name} Thread", wait), daemon=True)
        for wait, name in enumerate(["First", "Second", "Third"], 1)
    ]
    for thread in threads:
        thread.start()
    print("Los gehts")
    for thread in threads:
        thread.join()
    print("fertig")

if __name__ == "__main__":
    main()
mistered
User
Beiträge: 7
Registriert: Montag 27. Februar 2023, 18:43

Ok, danke schön. Also der Name ist unglücklich gewählt und das Modul is auch nicht erste Wahl. Dann noch den Thonny in die Tonne und es bestehen Chancen, dass ich das zum laufen bekomme. Ich mach mich da mal heute Nachmittag dran.
Besten Dank
Ed
Antworten