Seite 1 von 1

Thread Variable an Mutterthread übergeben

Verfasst: Freitag 25. Oktober 2019, 10:26
von Finux
Hallo,
ich suche eine Möglichkeit bei der Nutzung von Threads in einer Client- Server Kommunikation Values zu "returnen". Also ich möchte eigentlich den Thread selbst nicht unbedingt beenden müssen um an die Variable zu kommen (wenn ich das aber tun müsste würde ich damit leben können).
Ich spreche natürlich an eine Übergabe an den Mutter-Thread

So richtig schlau werde ich aus meinen Suchergebnissen bei Dr.Google nicht. Vielleicht übersehe ich aber auch etwas oder mache es mal wieder komplizierter als es ist...?

Betreffend Python3 mit dem Modul threading.

LG

Re: Thread Variable an Mutterthread übergeben

Verfasst: Freitag 25. Oktober 2019, 10:31
von Sirius3
Das Stichwort, nach dem Du Suchen mußt ist `Queue`.

Re: Thread Variable an Mutterthread übergeben

Verfasst: Freitag 25. Oktober 2019, 10:55
von Finux
Danke! Ich war nicht sicher welche Möglichkeit für mich am meisten Sinn macht.

Jedoch klappt es noch nicht so ganz wie ich mir das erhofft hatte. Was übersehe ich hier?!

Code: Alles auswählen

   
    q = queue.Queue

    t1 = threading.Thread(target=msg_receive, args=(conn, IP, q))
    t1.start()
    my_thread_result = q.get()
    print(my_thread_result)

die Funktion sieht (auf das Wesentliche reduziert) so aus:

Code: Alles auswählen

def msg_receive(conn, IP, q):
            msg = conn.recv(4096).decode("utf-8")
            q.put(msg)
Pardon- hier der Traceback:

Code: Alles auswählen

    my_thread_result = q.get()
TypeError: get() missing 1 required positional argument: 'self'

Re: Thread Variable an Mutterthread übergeben

Verfasst: Freitag 25. Oktober 2019, 10:57
von Sirius3
Und was klappt dabei nicht?

Re: Thread Variable an Mutterthread übergeben

Verfasst: Freitag 25. Oktober 2019, 11:02
von Finux
hatte mich an folgendem bsp orientiert:

Code: Alles auswählen

import queue
import threading

# creating queue instance
q = queue.Queue()

# creating threading class
class AnyThread():
    def __init__ (self):
        threading.Thread.__init__(self)

    def run(self, a, b):
        # in this class and function we will put our execution test function
        test(a, b)

t = AnyThread()

# having our test target function
def test(a, b):
    # do something in this function:
    result = a + b
    # and put result to a queue instance
    q.put(result)

for i in range(3): #calling our threading fucntion 3 times (just for example)
    t.run(3+i, 2+i)
    output = q.get() # here we get output from queue instance
    print(output)

>>> 5
>>> 7
>>> 9

bin jedoch nicht wirklich firm in der oop. wieso muss ich hier zwingend aus self referenzieren? der thread ist doch klar (q wurde ja übergeben), es wurde mit put "gesetzt" und mit get wieder abgeholt..?!

Re: Thread Variable an Mutterthread übergeben

Verfasst: Freitag 25. Oktober 2019, 11:37
von kbr
Du mußt auch eine Instanz von Queue anlegen (Klammern nicht vergessen!):

Code: Alles auswählen

q = queue.Queue()  # statt q = queue.Queue

Re: Thread Variable an Mutterthread übergeben

Verfasst: Freitag 25. Oktober 2019, 11:59
von Sirius3
@Finux: das Beispiel ist ja auch totaler Schrott. nur weil eine Klasse `Thread` im Namen hat, ist das noch lange kein Thread. Und irgendwelche __init__-Funktionen von fremden Klassen aufzurufen macht auch noch keinen Thread. Stackoverflow taugt nichts als Einstiegslektüre, weil oft die Leute, die da Antworten genauso Anfänger sind, wie die Fragenden.

Dein Code-Schnippsel ist dagegen doch ganz gut, bis darauf, dass man auch eine Queue-Instanz erzeugen muß, wie kbr schon schrieb.

Re: Thread Variable an Mutterthread übergeben

Verfasst: Freitag 25. Oktober 2019, 14:52
von Finux
^^ oh yes. danke.