Threading, auch ein Verständisproblem

  • Hallo,

    vorab zu meiner Frage: ich habe die letzten Tage versucht "threading" zu verstehen, und obwohl ich irgendwann mal dachte "jetzt verteh' ich's", trifft es wohl eher zu, dass dies nicht der Fall ist. Außerdem: Da Threading generell nicht für Programmier-Anfänger empfohlen wird, werde ich das wohl eher nicht in mein kleines Projekt einbauen. Es geht darum, auf einem auf einem Raspberry einen Telegram-Bot zu erstellen, der die selbe Nachricht an eine Liste von Usern schickt. Ich dachte, dass sich "Threading" dafür anbieten würde, damit die Nachrichten nicht alle nacheinander geschickt werden müssen. Sehe ich das etwa richtig?

    Langer Rede kurzer Sinn: Warum gibt dieser Code:

    die Meldung: RuntimeError: threads can only be started once? In verschiedenen anderen Foren habe ich nämlich gelesen, dass mit return in der Funktion test() der Thread eigentlich geschlossen werden sollte. Deshalb dachte ich, ich könnte denselben Thread einfach wieder starten und deshalb verstehe ich die Fehlermeldung nicht. Hintergrund meiner Frage ist, dass mein Telgramm-Bot in einer Schleife laufen würde, und bei einer bestimmten Bedingung, die sich immer wieder mal wiederholt, sollte die besagte Nachricht an alle User der Liste rausgehen.

    viele Grüße

    lippih

  • Du kannst den Thread nicht mal eben recyceln. Ein einfaches Beispiel für Python 3:

    Eingerückt wird mit vier Leerzeichen!

    Edit: sorry, da war ein Copypaste-Fehler mit n und i. :shy:

  • Danke schon mal für die Antworten!

    Zeig mal deinen Code deines Telegram-Bots, damit lässt sich dein Problem denk ich besser erarbeiten

    Die Nachrichten sollten in etwas so verschickt werden:

    Code
    import telepot
    
    bot = telepot.Bot('TOKEN')
    userlist = (10,50)
    
    while True
        pass
        if True:
            for userID in userlist:
                bot.sendMessage(userID, 'Das ist die Nachricht')

    mit threading dacht ich könnte ich auch folgendes Problem behandeln: Sollte keine Verbindung zum I-Net bestehen, dann bricht das Script ab. Das sollte es aber nicht, egal ob die Messages verschickt werden können oder nicht

  • Ok, das habe ich vielleicht etwas unglücklich formuliert: pass steht für Code, der dazu führt dass If wahr wird, dann sollten eben die Nachrichten verschickt werden, und ich dachte das Verschicken in verschiedenen Threads wäre vielleicht sinnvoll.

  • Ok, das habe ich vielleicht etwas unglücklich formuliert

    Allerdings :bussi2:

    pass steht für Code, der dazu führt dass If wahr wird, dann sollten eben die Nachrichten verschickt werden

    So ein # Kommentar kann Wunder wirken ;)

    ich dachte das Verschicken in verschiedenen Threads wäre vielleicht sinnvoll.

    Dann reden wir doch jetzt mal Klartext. CPython hat den GIL, kurz zusammengefasst: Threads können in Python nicht zur echten Parallelisierung genutzt werden.

    Außerdem ist das Netzwerk auch irgendwann ausgelastet (gut, dauert ein bisschen). Auf dem Pi kommt da noch USB dazu, die teilen sich einen Controller.

    Von wie vielen Usern/Chats reden wir?

  • Tatsächlich ist die Verzögerung kein Problem; getrieben werde ich eher vom Gedanken, wie man es machen würde ... Aber je länger wir hier diskutieren, umso bewusster wird mir, dass ich, zumindest jetzt noch, bei den einfachen Dingen bleiben sollte. Gedanken muss ich mir nun eher machen, das Abbrechen des Scripts zu unterbinden, wenn z.B. das WLAN aus ist und die Messages nicht verschickt werden können.

  • Hallo,

    also Threading kann schon Sinn machen, wenn etwas "I/O bound" ist, d.h. das I/O der begrenzenden Faktor ist und das Programm darauf wartet. Im gegebenen Fall macht das aber in der Tat wenig Sinn, siehe letzter Post von linusg.

    Für so Netzwerk-Sachen würde sich auch asyncio eignen, das Python ab 3.5 "richtig" an Bord hat. Das ist aber tendenziell schwieriger zu verstehen als Threading. Und würde hier auch nur Sinn machen, wenn das Skript neben dem Versand von Nachrichten noch was anderes machen muss / soll.

    Gruß, noisefloor

  • Danke schon mal für die Antworten!

    Die Nachrichten sollten in etwas so verschickt werden:

    Code
    import telepot
    
    bot = telepot.Bot('TOKEN')
    userlist = (10,50)
    
    while True
        pass
        if True:
            for userID in userlist:
                bot.sendMessage(userID, 'Das ist die Nachricht')

    mit threading dacht ich könnte ich auch folgendes Problem behandeln: Sollte keine Verbindung zum I-Net bestehen, dann bricht das Script ab. Das sollte es aber nicht, egal ob die Messages verschickt werden können oder nicht

    Hallo,

    ich habe das probiert und bekomme Fehler in Zeile 4:

    File "send.py", line 4

    while True

    ^

    SyntaxError: invalid syntax


    Leider verstehe ich davon nicht viel:conf: aber ich möchte trotzdem weiter basteln;)

    Kann mir jemand mal eine Idee geben, wie ich mit Python eine Nachricht versende ohne, dass ich vom Handy eine Anfrage schicke?

    Ich habe das vor 2 Jahren mal auf Windows 10 mit VBA gemacht, aber da ist alles anders:no_sad:

    Gruss Guido

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • Code
    import telepot
    bot = telepot.Bot('467899999:AAF9ACwx_YJZstKl_dxXPqFgwX1LoaX8Wtg')
    userlist = (10,50)
    while True
        pass
        if True:
            for userID in userlist:
                bot.sendMessage(userID, 'Das ist die Nachricht')

    hatte nur den Token umgeschrieben...

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • komme erst später am meinen PC:(

    mache ich dann.

    PS: der Token ist nicht mein wirklicher Token:angel:

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • ich durfte an meinen PC :bravo2:

    habe das auch gleich so probiert:

    Code
    import telepot
    bot = telepot.Bot('46789999:AAF9ACwx_YJZstKl_dxXPqFgwX1LoaX8Wtg')
    userlist = (10,50)
    while True:
        if True:
            for userID in userlist:
                bot.sendMessage(userID, 'Das ist die Nachricht')

    Toll ist ja schon mal, dass keine Fehler mehr kommen, aber senden tut die Beere nichts...

    PS:

    was macht diese Zeile: userlist = (10,50) ??

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

  • Zeile 5 ist auch Sinnlos - wenn du die entfernst vergesse nicht die Einrückungen anzupassen.

    Generell ist fraglich ob die while überhaupt benötigt wird? Wenn Du es nicht weißt: auch weg lassen.


    //EDIT: Ich glaube es wäre besser Du erstellst dir einen eigenen Thread, da dieser Thread ein ganz anderes Problem behandelt und es unhöflich wäre diesen zu zweckentfremden....

  • Code
    import telepot
    bot = telepot.Bot('467899999:AAF9ACwx_YJZstKl_dxXPqFgwX1LoaX8Wtg')
    userlist = (10,50)
    for userID in userlist:
        bot.sendMessage(userID, 'Das ist die Nachricht')

    geaendert. keine Nachricht

    Mit diesem Code kann ich jedoch vom Handy die Zeit oder Zufallszahl abrufen oder eben ein "blabla" bekommen. Also die Verbindung funktioniert

    Ich habe eine Raspi Beere 3 und freue mich, dass sie läuft. Ich programmiere gern und freue mich wenn es auch funktioniert. Aber grundsätzlich hab ich keine Ahnung davon :conf:

    Bitte löscht nie dieses Forum! Hier steht alles drin was ich mir merken muss!

Jetzt mitmachen!

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