Thread Variable an Mutterthread übergeben

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Finux
User
Beiträge: 32
Registriert: Mittwoch 18. September 2019, 13:59

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Stichwort, nach dem Du Suchen mußt ist `Queue`.
Benutzeravatar
Finux
User
Beiträge: 32
Registriert: Mittwoch 18. September 2019, 13:59

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'
Zuletzt geändert von Finux am Freitag 25. Oktober 2019, 10:58, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Und was klappt dabei nicht?
Benutzeravatar
Finux
User
Beiträge: 32
Registriert: Mittwoch 18. September 2019, 13:59

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..?!
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Du mußt auch eine Instanz von Queue anlegen (Klammern nicht vergessen!):

Code: Alles auswählen

q = queue.Queue()  # statt q = queue.Queue
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
Finux
User
Beiträge: 32
Registriert: Mittwoch 18. September 2019, 13:59

^^ oh yes. danke.
Antworten