@Carola1: ``global`` ist böse weil globaler Zustand böse ist, weil das eine Menge Probleme und Einschränkungen mit sich bringt. Das betrifft auch `zipFile`, `i`, und `j`, und `t`, die ebenfalls global auf Modulebene verfügbar sind und dort nichts zu suchen haben. Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Reines importieren sollte zudem ohne Seiteneffekte funktionieren, also ohne dass das Hauptprogramm läuft. Das ist zum Beispiel wichtig wenn man in CPython das Ganze tatsächlich parallel ausführen möchte, denn dazu eignen sich Threads hier nicht, da muss man Prozesse verwenden. Über `multiprocessing` oder `concurrent.futures`.
Selbst wenn man es mit Threads macht, sollte eines der beiden Module verwenden weil die einen Pool zur Verfügung stellen, also die Anzahl der gleichzeitig laufenden Threads beschränken. Dein Ansatz ist da fehlerhaft weil die meisten Betriebssysteme die Anzahl von Threads pro Prozesse einschränken und Dein Programm dann mit einer Ausnahme abbricht wenn zu viele Threads gestartet werden.
Wo wird garantiert das `zipfile.ZipFile` threadsicher ist? Das mag zufällig funktionieren, oder aber auch nicht. Solange das nicht explizit garantiert ist, sollte man da pro Thread ein Objekt von erstellen. Würde ich sonst als Fehler im Programm ansehen. Und das ist vielleicht sogar genau das Problem hier. Viele Threads die auf dem inneren Zustand des gleichen Objektes operieren.
Die Namenschreibweise hält sich nicht an den
Style Guide for Python Code. Zudem ist `boolean` ein schlechter Name. Den Leser interessiert mehr was der Wert bedeutet und weniger von welchem Grunddatentyp der ist. Das sieht man an der Verwendung im Code.
`crack()` stimmt als Name auch nicht so wirklich und das `my` bei `myLetters` macht keinen Sinn. Einbuchstabige Namen sind selten wirklich beschreibend, und `j` als Laufvariable in einer Schleife an etwas anderes als ganze Zahlen zu binden ist sehr verwirrend.
Expliziter Vergleich mit `True` und `False` ist überflüssig. Da kommt sowieso nur wieder `True` oder `False` bei heraus, also in diesem Fall genau der Wert den `boolean` sowieso schon hatte.