Seite 1 von 1

thread lock

Verfasst: Mittwoch 20. Juli 2011, 17:12
von waki
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

Re: thread lock

Verfasst: Mittwoch 20. Juli 2011, 18:07
von pillmuncher
Warum benutzt du das low level Modul thread, statt threading?

Re: thread lock

Verfasst: Mittwoch 20. Juli 2011, 19:24
von EyDu
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.