Seite 1 von 1

shared data mit threads

Verfasst: Mittwoch 6. Mai 2009, 16:05
von kait
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?

Verfasst: Mittwoch 6. Mai 2009, 16:10
von Birne94

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?

Verfasst: Mittwoch 6. Mai 2009, 16:19
von BlackJack
@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".

Verfasst: Mittwoch 6. Mai 2009, 16:21
von kait
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 :)