Threading

L I V E Stammtisch ab 20:30 Uhr im Chat
  • ich habe kein Problem mehr, möchte aber einge Zeilen posten die mir viele Stunden Suche erspart hätten.

    Prinzipiel habe ich echte Probleme mit den mitunter sehr esoterischen Feghlermeldungen von Python (offensichtlich etworfen von göttlichen Gurus die beim rasieren im Spiegel zuerst eine Klasse"Urknall" definieren und sich dann als 2898467ste vererbte Instanz den Rasierer ansetzen..)

    [PHP]
    import threading
    t2 = (0.5,)
    th2=threading.Thread(target=task2, args =(t2))
    print ('blink thread initialized')
    [/PHP]


    OK hier meine simplen Übersetzungen von Fehlermeldungen:

    "AssertionError: group argument must be none for now" Du hast "target=" vergessen
    "TypeError: 'module' object is not callable" Du hast ".Thread2 vergessen
    "TypeError: function argument after * must be a sequence..." Beistrich in den Argumenten fehlt


    Vielleicht hilft es jemanden

    Gottfried


  • "AssertionError: group argument must be none for now" Du hast "target=" vergessen
    "TypeError: 'module' object is not callable" Du hast ".Thread2 vergessen
    "TypeError: function argument after * must be a sequence..." Beistrich in den Argumenten fehlt

    1.) wahrscheinlich hast du target= vergessen, dann hat er es als group gewertet.
    2.) target muss auf ein callable (etwas aufrufbares) verweisen, zB eine Function.
    3.) args verlangt eine Liste, nicht ein einzelnes Argument. Wenn du nur ein Argument hast, stelle es so dar: args = (arg1,)

    Auch, wenns dich vielleicht unglücklich macht, aber ich find die Python Docs echt super. Hier die Signatur von Thread Objekten: https://docs.python.org/2.7/library/th…#thread-objects

  • noisefloor: er hat kein Problem. Er beschreibt Probleme, die er waehrend der Entwicklung hatte, aber geloest hat. Und die Fehlermeldungen schmeissen, seiner Meinung nach undurchsichtig sind.

  • [PHP]
    import threading
    t2 = (0.5,)
    th2=threading.Thread(target=task2, args =(t2))
    print ('blink thread initialized')
    [/PHP]

    Nicht unbedingt relevant aber vielleicht doch etwas fördernd...

    " t2 = (0.5,) " ... brauchst du nicht. Unnötige Variablen verbrauchen nur unnötig Ram. In diesem Fall machst du das mit den Klammern aber auch doppelt:

    " th2=threading.Thread(target=task2, args =(t2)) " ... Leerzeichen nach args aber danach kein Leerzeichen mehr. Liest sich blöd und wirkt auch nicht so strukturiert weil th2=threading keine Leerzeichen hat

    " print ('blink thread initialized') " ... ein Leerzeichen zu viel. Sieht ebenso blöd aus wie ein Leerzeichen zwischen Funktionsname und dem Doppeltpunkt, das hattest du glaub ich auch mal gemacht

    Schöner:
    [PHP]
    import threading
    th2=threading.Thread(target=task2, args=(0.5,))
    print('blink thread initialized')
    [/PHP]


    PS: Was genau programmierst du denn? ;)

  • meigrafd: ich verstehe deine Ausfuehrungen nicht.

    Natuerlich braucht er t2= (0.5,). Er braucht das Argument an args als Tupel, denn nur so wird es an task2 uebergeben - als Liste von Argumenten. Was er nicht braucht sind die extra Klammern um args = (t2).

    Und die Uebergungen zu unnoetigem RAM sind falsch. Das Tupel wird so oder so erzeugt, alles was hier unterschiedlich ist, ist das der Referenzzaehler um 1 groesser ist. Das hat also mit RAM nix zu tun. Und bei einer dynamischen, Garbage-Collector-basierten Sprache wie Python ist eine Diskussion ueber solchen Kleinkram eh fehl am Platze. Dort werden bestaendig Objekte erzeugt und wieder verworfen. Der simple Aufruf

    Code
    object = Foo()
    a = object.methode(argument)

    fuehrt zur Erzeugung eines neuen "BoundMethod"-Objektes welches "object" und "Foo.methode" miteinander verbindet, einem Argument-Tupel, in dem "argument" drin steckt, und einem Frame-Objekt - plus wahrscheinlich noch einigen mehr.

    *stilistisch* ist es natuerlich richtig, nicht ein extra Tupel "t2" zu erzeugen, wenn man es zu nichts anderem braucht, als fuer den Thread(...)-Aufruf. Und guter Stil ist sicher wichtig - aber sollte nicht mit vermeintlichen Effizienz-Argumenten untermauert werden.

  • Ich verstehe deinen Widerspruch nicht.

    Er macht daraus ne Tuple dort wo es an args angefügt wird: args=(0.5,)
    Und bei nur einem Argument was er übergibt brauch er ein Komma am Ende: args=(0.5) wirft einen Fehler. Dh er kann nicht args = (t2) verwenden sondern wenn dann args = (t2,) .. Da er aber t2=(0.5,) setzt brauch er bei args= weder ( noch ,

    ...Er muss es so machen, kann es stilistisch aber auch weglassen...

    crazy.gif

Jetzt mitmachen!

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