Python3 Threading

      Python3 Threading

      Python-Quellcode

      1. .. imports / variablen etc ..
      2. jobs=[]
      3. threads=[]
      4. results=[]
      5. def printResults():
      6. for result in results:
      7. print(result[0])
      8. for season in result[1]:
      9. print("Season",season[0])
      10. for missing in season[1]:
      11. print(missing)
      12. def job():
      13. while(jobs):
      14. tmp = jobs.pop()
      15. task(drive=tmp[0],serie=tmp[1])
      16. def task(drive, serie):
      17. print("Serie[{0}]".format(serie))
      18. sc = serienchecker(drive, serie,blacklist,apikeyv3,language)
      19. sc.start()
      20. result = sc.result
      21. if(result[1]):
      22. results.append(result)
      23. for drive in drives:
      24. series = folder.getFolders(drive)
      25. for serie in series:
      26. jobs.append([drive,serie])
      27. for index in range(threadCount):
      28. print("Start Thread {0}".format(index+1))
      29. t = threading.Thread(target=job)
      30. threads.append(t)
      31. for thread in threads:
      32. thread.start()
      33. for thread in threads:
      34. thread.join()


      Wie bekomme ich es hin das Zeile: 16| 20| 25? Immer nur ein Thread ausführt? ist es in Zeile 16 sowie 25 notwendig?
      Gehe ich generell an die Aufgabe richtig ran? Für ein Thread läuft das Programm normal durch
      Habt ihr Vorschläge zur Verbesserung?

      // Generell weicht das Ergebnis mit einen Thread von dem Ergebnis mit 10 Threads ab, also mache ich wahrscheinlich irgendwas komplett falsch

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „masterholdy“ ()

      Sieht eig richtig aus. Was macht serienchecker?
      Ist die Klasse thread safe?
      Greift der auf eine Webschnittstelle zu?
      Wenn ja, dann könnte es sein, dass diese Webschnittstelle nur begrenzt Anfragen zulässt?

      Edit: Wenn serienchecker nur von einem Thread aufgerufen werden soll, wo ist denn dann der Flaschenhals, den du versucht mit den Threads zu lösen?
      Wozu brauchst du Threads, wenn diese alle aufeinander warten müssen, weil serienchecker nicht parallelisierbar ist.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „krusty“ ()

      krusty schrieb:

      Sieht eig richtig aus. Was macht serienchecker?
      Ist die Klasse thread safe?
      Greift der auf eine Webschnittstelle zu?
      Wenn ja, dann könnte es sein, dass diese Webschnittstelle nur begrenzt Anfragen zulässt?

      Edit: Wenn serienchecker nur von einem Thread aufgerufen werden soll, wo ist denn dann der Flaschenhals, den du versucht mit den Threads zu lösen?
      Wozu brauchst du Threads, wenn diese alle aufeinander warten müssen, weil serienchecker nicht parallelisierbar ist.


      habe in der themoviedb klasse noch eine exception für Request Rate Limiting überschreitungen hinzugefügt, ich erreiche leider schon bei 2 Threads das Limit von 4 Anfragen die Sekunden, also kann ich wohl threading vergessen
      leider ist die limitierung IP und nicht API-Key basierend sonst würde ich mir einfach noch ein paar Keys generieren

      echt schade, durch die ganzen anfragen läuft mein programm welches überprüfen soll ob alle serien auf meiner festplate up2date sind über 20minuten durch..

      ich würde sagen ich kann die idee damit verwerfen oder fällt euch noch etwas ein?

      EDIT://
      was haltet ihr generell von der idee
      (getTVDB Aktuell)
      Spoiler anzeigen

      Python-Quellcode

      1. def getTVDB(self, query):
      2. query = query.replace(" "," ")
      3. response = requests.get(query)
      4. status = response.status_code
      5. if(status == 200):
      6. return response
      7. if(status == 401):
      8. raise ValueError('Invalid API key!')
      9. if(status == 404):
      10. raise ValueError('Resource could not be found. Request = ' + query)
      11. if(status == 429):
      12. raise ValueError('Request Rate Limit Reached')


      sobald ich die anfrage limitierung überschritten habe einfach die Funktion nochmal aufzurufen bis ich ein response bekommen habe? z.b.

      Spoiler anzeigen

      Python-Quellcode

      1. def getTVDB(self, query, timer=0):
      2. query = query.replace(" "," ")
      3. response = requests.get(query)
      4. status = response.status_code
      5. if(status == 200):
      6. return response
      7. if(status == 401):
      8. raise ValueError('Invalid API key!')
      9. if(status == 404):
      10. raise ValueError('Resource could not be found. Request = ' + query)
      11. if(status == 429):
      12. if(timer<10):
      13. self.getTVDB(query,(timer+1))
      14. raise ValueError('Request Rate Limit Reached')

      würde in diesen fall sobald einmal ein 429 code abgefangen wird
      und beispielsweise nach timer=5 versuchen der code 200 (gültige anfrage) erreicht wird und die response normal return wird
      trotzdem die exception request rate limit.. geworfen?

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „masterholdy“ ()