threading und Queue

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
XCDRiVER
User
Beiträge: 31
Registriert: Sonntag 12. Februar 2017, 19:59

threading und Queue

Beitragvon XCDRiVER » Dienstag 14. Februar 2017, 21:43

Hallo Forum,
ich habe zwei Klassen, die einzeln durch threading.Thread gestartet werden.
Um Informationen zwischen beiden Klassen auszutauschen wollte ich die multiprocessing.Queue() Klasse benutzen,
geht das überhaupt oder funktioniert Queue nur im Zusammenhang mit Process?

Ich konnte bislang keinen Beispielcode dazu finden, hättet ihr da mal einen Link für mich, wo ich mir das mal anschauen kann?
vielen Dank
Benutzeravatar
XCDRiVER
User
Beiträge: 31
Registriert: Sonntag 12. Februar 2017, 19:59

Re: threading und Queue

Beitragvon XCDRiVER » Dienstag 14. Februar 2017, 22:18

Ach sorry, ich hab nun doch einen Weg gefunden dass es erst mal läuft.
  1. from multiprocessing import Queue
  2. import threading
  3.  
  4. class Eins(object):
  5.  
  6.     data = 512
  7.    
  8.     def __init__(self, q):
  9.         self.q = q
  10.         self.q.put(self.data)
  11.        
  12. class Zwei(object):
  13.    
  14.     def __init__(self, q):
  15.         self.q = q
  16.         self.dataZwei = self.q.get()
  17.         print(self.dataZwei)
  18.  
  19. if __name__ == "__main__":
  20.  
  21.     q = Queue()
  22.  
  23.     eins = threading.Thread(target=Eins, args=(q,))
  24.     eins.start()
  25.  
  26.     zwei = threading.Thread(target=Zwei, args=(q,))
  27.     zwei.start()
BlackJack

Re: threading und Queue

Beitragvon BlackJack » Dienstag 14. Februar 2017, 22:52

@XCDRiVER: Ich würde diese Queue nicht ohne/ausserhalb von `multiprocessing` verwenden. Es gibt `Queue.Queue`.
Benutzeravatar
XCDRiVER
User
Beiträge: 31
Registriert: Sonntag 12. Februar 2017, 19:59

Re: threading und Queue

Beitragvon XCDRiVER » Dienstag 14. Februar 2017, 22:56

ah, danke für den Tipp, ich schaue mal in die docs.
Benutzeravatar
XCDRiVER
User
Beiträge: 31
Registriert: Sonntag 12. Februar 2017, 19:59

Re: threading und Queue

Beitragvon XCDRiVER » Donnerstag 16. Februar 2017, 21:11

hallo Leute,
ich krieg es nicht hin :|
ich möchte eigentlich Daten hin und her schicken.
Es wird aber nur die erste Nachricht durchgegeben, data="eins". Zumindest denke ich das.
Ich brauche mal einen Tipp was ich falsch mache.

  1. from queue import Queue
  2. import threading
  3.  
  4. class Eins(object):
  5.  
  6.     data = "eins"
  7.  
  8.     def __init__(self, q):
  9.         self.q = q
  10.         self.q.put(self.data)
  11.         self.dataEins = self.q.get()
  12. ##        self.q.task_done()
  13.         print(self.dataEins)
  14.  
  15. class Zwei(object):
  16.  
  17.     data = "zwei"
  18.    
  19.     def __init__(self, q):
  20.         self.q = q
  21.         self.dataZwei = self.q.get()
  22. ##        self.q.task_done()
  23.         print(self.dataZwei)
  24.         self.q.put(self.data)
  25.         print("geschickt")
  26.        
  27. if __name__ == "__main__":
  28.  
  29.     q = Queue()
  30.  
  31.     eins = threading.Thread(target=Eins, args=(q,))
  32.     zwei = threading.Thread(target=Zwei, args=(q,))
  33.  
  34.     eins.start()
  35.     zwei.start()



die Ausgabe ist:

eins


gewünschte Ausgabe ist:

eins
zwei
geschickt
Benutzeravatar
XCDRiVER
User
Beiträge: 31
Registriert: Sonntag 12. Februar 2017, 19:59

Re: threading und Queue

Beitragvon XCDRiVER » Donnerstag 16. Februar 2017, 21:44

hmm,
ich denke fast das die queue.Queue() anders als die multiprocessing.Queue() nicht in beide Richtungen funktioniert.
habe hier (https://pymotw.com/2/Queue/) gerade was von Dequeue gelesen. ...
ich schau mir das noch mal an...
Benutzeravatar
XCDRiVER
User
Beiträge: 31
Registriert: Sonntag 12. Februar 2017, 19:59

Re: threading und Queue

Beitragvon XCDRiVER » Donnerstag 16. Februar 2017, 22:15

ich glaube das Dequeue() nicht das ist was ich brauche,
wenn ich das richtig verstehe, kann ich damit eine bestehende Pipe von der einen oder anderen Öffnung lesen.
Ich muss aber Daten unabhängig voneinander hin und her transportieren, nach dem FIFO Prinzip.
Sollte ich vielleicht mehrere queue.Queue() benutzen?
So jeweils eine für Hin- und Rücktransport?
Macht man das so für Kommunikation unter Klassen?

vielen Dank
Benutzeravatar
kbr
User
Beiträge: 685
Registriert: Mittwoch 15. Oktober 2008, 09:27
Wohnort: Düsseldorf

Re: threading und Queue

Beitragvon kbr » Freitag 17. Februar 2017, 09:13

XCDRiVER hat geschrieben:ich glaube das Dequeue() nicht das ist was ich brauche
Was Du brauchst ist Queue. Dies ist ein threadsicherer Wrapper um dequeue.

  1. import time
  2. from threading import Thread
  3. from queue import Queue, Empty
  4.  
  5.  
  6. def send(queue, message_nums=10):
  7.     for n in range(message_nums):
  8.         time.sleep(0.2)
  9.         queue.put('message number: {}'.format(n))
  10.        
  11.        
  12. def receive(queue):
  13.     while True:
  14.         try:
  15.             message = queue.get(timeout=1)
  16.         except Empty:
  17.             break
  18.         print(message)
  19.     print('done.')
  20.    
  21.  
  22. queue = Queue()
  23. Thread(target=send, args=(queue,)).start()
  24. Thread(target=receive, args=(queue,)).start()
Sirius3
User
Beiträge: 6375
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: threading und Queue

Beitragvon Sirius3 » Freitag 17. Februar 2017, 10:02

@kbr: soweit war XCDRiVER doch schon. Nur ist eben eine Queue wie jedes handelsübliche Rohr nur zum Transport in eine Richtung geeignet. Neben einer Wasserzuleitung braucht man eben auch noch ein Abwasserrohr.

@XCDRiVER: wo hast Du Schwierigkeiten zwei Queues zu benutzen?
Benutzeravatar
kbr
User
Beiträge: 685
Registriert: Mittwoch 15. Oktober 2008, 09:27
Wohnort: Düsseldorf

Re: threading und Queue

Beitragvon kbr » Freitag 17. Februar 2017, 11:45

Sirius3 hat geschrieben:@kbr: soweit war XCDRiVER doch schon.
Ah, zu oberflächlich gelesen. Na dann eben zwei Queues.
Benutzeravatar
XCDRiVER
User
Beiträge: 31
Registriert: Sonntag 12. Februar 2017, 19:59

Re: threading und Queue

Beitragvon XCDRiVER » Freitag 17. Februar 2017, 22:20

hallo kbr, hallo Sirius3,
danke für die Rückmeldung,
ich hatte die Queue zuerst mit multiprocessing im Test, dort funktioniert die Queue in beide Richtungen, lesen und schreiben.
Ich wusste nicht, dass die queue.Queue() nur in eine Richtung funktioniert, dass erklärt natürlich das Verhalten im Test.
Ich probiere mal mit mehreren Queue herum, zum schreiben und zum lesen,
wichtig ist mir nur, das ich eine saubere Lösung für den Informationsaustausch zwischen den Klassen finde.
Ich denke mal das wird jetzt schon ganz gut.
Vielen Dank euch

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], ch_neu, Zizibee