Hallo,
das sind gleich zwei Fehler auf einmal. Der erste Fehler ist, dass du die Regeln von Namensräumen unter Python nicht nicht kennst. Die Liste "L" in "FillList" ist eine andere Liste als die aus Zeile 3. Die in der Funktion erzeugte Liste existiert nur lokal in der Funktion, danach nicht mehr. Dann stellt sich natürlich noch die Frage, warum du L überhaupt als Ergebnis zurücklieferst. Threads haben kein Ergebnis. Das sieht ein wenig danach aus, als versuchst du dich durch den Code zu raten. Die Lösung zu dem Problem ist ganz einfach: Übergebe, zusätzlich zu "a", "b" und "c" die Liste, welche gefüllt werden soll.
Das zweite Problem ist, dass du überhapt keine Werte an die Liste anhängst. Du erstellst bei jedem Aufruf eine komplett neue Liste und überschreibst diese einfach mit den Werten aus ``range(a, b, c)``. Wenn du etwas an eine Liste anhängen willst, dann musst du das auch tun. Der Interpreter kann nicht wissen, was du eigentlich vor hast.
Als nächstes fällt dann sofort auf, dass dein ganzer Code auf modulebene steht. Dass solltest du dir gleich abgewöhnen und entsprechend in Funktionen verpacken. In deinem Fall bietet sich eine einfach main-Funktion an, welche die Erzeugung, das Starten und das Zusammenführen der Threads enthält. Dafür gibt es in Python auch in Idiom:
Code: Alles auswählen
def main():
thrF1 = threading. ...
if __name__ == "__main__":
main()
Damit ist sichergestellt, dass du deinen Code auch importieren kannst. Somit ist er besser wiederverwendbar.
Dann solltest du dir auch gleich die vernünftige Vergabe von Namen angewöhnen. "thrF1" hat gar keine Aussagekraft, lasse dir hier etwas besseres einfallen. Am besten einen aussagekräftigen Namen, der dir (und uns helfenden Lesern) beim Verständnis hillft. Sonst weißt du in zwei Wochen nicht mehr, was sich eigentlich hinter dem Namen verbirgt.
Eine weitere schlechte Idee ist das Durchnummerieren von Namen. Wenn du anfängst Nummern zu vergeben, dann verwendest du die falsche Datenstruktur und möchtest auf Tupel oder Listen, ggf. auch ein Dictionary, umsteigen. Bei der Gelegenheit könntest du auch einen Blick auf PEP 8 werfen, dort werden einige Konventionen aufgeführt. So sollten Funktionsnamen durch Unterstriche geteilt sein, also "fill_list", statt "FillList" und aus Kleinbuchstaben bestehen. "FillList" deutet im Pythonkontext, und in vielen anderen Sprachen auch, auf eine Klasse hin. Auch sind die ganzen Leerzeichen um die Gleichheitszeichen bei den Parametern störend.
Und natürlich solltest du auch gleich vergessen, dass es globale Variablen gibt. Wenn du dir nicht sicher bist, dass du eine globale Variable verwenden solltest oder nicht, dann ist es ein klares Zeichen dafür, dass du sie nicht verwenden solltest. Wie ich oben schon geschrieben habe, ist das für "L" auch vollkommen unnötig, wenn du die Liste als Parameter übergist.
Auch die Umsetzung deines Ansatzes hat Probleme. Du wartest 0,15 Sekunden zu Beginn der Füllfunktion und füllst diese dann auf einen Schlag. Damit wirst du keinen Effekt feststellen. Du musst schon über die Elemente des range-Objekts iterieren und diese schrittweise in die Liste einfügen und zwischen den einzelnen Schritten warten.
Dann kommt noch hinzu, dass du den Zugriff auf die Liste "L" schützen musst, damit du nicht versehentlich zur selben Zeit in die Liste schreibst. Das dürfte unter CPython in diesem Fall eigentlich nicht passieren, aber bereits bei unwesentlich komplexeren Programmen (oder einem anderen Interpreter) wirst du auf das Problem stoßen. Do solltest dir dazu mal "threading.Lock" anschauen.
Das waren jetzt zwar recht viele Informationen, aber Threading ist eben ein recht komplexes Thema. Bereits bei so einfach Aufgaben.
Das Leben ist wie ein Tennisball.