thread lock

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
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

Guten Tag,
ich bin gerade ein bisschen am programmieren und hab das Problem, dass sich mein Programm immer aufgrund des locks aufhängt. Leider weiß ich nicht wie ich dort lock umgehen kann oder habe ich einen Fehler, dass es nicht funktioniert?

Code: Alles auswählen

lock = thread.allocate_lock()
actions = Queue.Queue()
threading = True

def write(value,start, al=False):
    lock.acquire() #HIER HÄNGT ES
    if threading == True and al == False:
        actions.put((0,value,start))
        lock.release()
    elif threading == False or al == True:
        lock.release()
        fobj = open(datei, "rb+")
        fobj.seek(start, 0)
        fobj.write(value)
        fobj.close()


def foo():
    while True:
        lock.acquire()
        if threading == False:
            if actions.empty():
                break
            
        art, data, start = actions.get()
        lock.release()
        if art == 0:
            write(data, start, True) 
        elif art == 1:
            truncate(start, True) #Egal

thread.start_new_thread(foo, ())
write("test", 0)
gruß waki
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Warum benutzt du das low level Modul thread, statt threading?
In specifications, Murphy's Law supersedes Ohm's.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

So auf den ersten Blick:

Du rufst in `foo` `lock.aquire` auf und wartest dann ewig, dass etwas über `actions` angkommt. Leider wird das unter Umständen nie passieren (bzw irgendwann nicht mehr), da der Lock gesetzt ist und du in `write` niemals den geschützten Bereicht betreten kannst. Die `Queue` ist übrigens bereits threadsicher, die musst du nicht noch einmal schützen, bzw. darfst es hier gar nicht.

Oder alternativ: Du benutz in `foo` das `break` und gibst damit den Lock ebenfalls nie wieder frei.

Edit: `== True` ist überflüssig und stat `== False` solltest du `not` benutzen.
Das Leben ist wie ein Tennisball.
Antworten