shared data mit threads

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.
Antworten
kait
User
Beiträge: 9
Registriert: Mittwoch 6. Mai 2009, 14:23

Mittwoch 6. Mai 2009, 16:05

Hallo,
ich habe eine (vermutlich total dämliche ;) ) Frage zu Threads. Ich benutze das threading Modul und habe in meinem main-Thread verschiedene Datenstrukturen. Die aufgerufenen Threads sollen nun diese Datenstrukturen verändern. Das ich da mit locks arbeiten muss ist mir schon klar. Was ich nicht verstehe ist: Wie übergebe ich die zu ändernden Datenstrukturen am geschicktesten an die Threads ohne eine Kopie anzufertigen. Der main-Thread soll also immer auf die aktuellen Daten zugreifen können. Zumindest solange kein anderer Thread gerade was an Ihnen verändert. Unter c würde ich da jetzt einfach einen Pointer verwenden, aber wie funktioniert das unter Python?

Ich hoffe mal ich habe mich einigermaßen verständlich ausgedrückt?!

Das ganze sieht stark verkürzt so aus (das hier soll nur mein Problem verdeutlichen und erhebt keinen Anspruch auf Lauffähigkeit ;) ):

Code: Alles auswählen

import threading
import time

class foo( threading.Thread ):
  def run(self):
    while True :
      #hole daten vom netzwerk und schreibe sie in liste aus dem main-thread
      time.sleep(60)

liste = []

bar = foo()
bar.start()

while True:
  #arbeite mit den akutellen daten aus der liste
Wie bringe ich also den thread "bar" dazu die daten in der liste aus dem main-thread zu verändern?
Birne94
User
Beiträge: 90
Registriert: Freitag 28. November 2008, 15:18
Kontaktdaten:

Mittwoch 6. Mai 2009, 16:10

Code: Alles auswählen

import threading
import time

class foo( threading.Thread ):
  def __init__(self, liste):
    threading.Thread.__init__(self)
    self.liste = liste
  def run(self):
    while True :
      #hole daten vom netzwerk und schreibe sie in liste aus dem main-thread
      self.liste.append("item")
      time.sleep(60)

liste = []

bar = foo(liste)
bar.start()

while True:
  #arbeite mit den akutellen daten aus der liste 
meinst du so?
BlackJack

Mittwoch 6. Mai 2009, 16:19

@kait: Was meinst Du mit "ohne Kopien anzufertigen"? "Fertige" einfach keine an, sondern übergibt das Objekt. Python kopiert Objekte nie implizit.

Ansonsten könnte hier auch eine `dequeue.Queue` nützlich sein, die ist für Kommunikation zwischen Threads gedacht, d.h. die ist "thread safe".
kait
User
Beiträge: 9
Registriert: Mittwoch 6. Mai 2009, 14:23

Mittwoch 6. Mai 2009, 16:21

Birne94 hat geschrieben:meinst du so?
Aus irgendeinem Grund bin ich davon ausgegangen das, dass hier:

Code: Alles auswählen

self.liste = liste
eine Kopie anfertigt und sich Änderungen an self.liste, dann nicht auch auf liste auswirken.
Ich dachte eigenltich auch, ich hätte das so probiert,... Nunja, manchmal probiert man auch soviel das man am Ende nicht mehr weiß was genau man gerade so tut :)
Antworten