Mam go! :-)

Od wielu miesięcy gnębi mnie jeden błąd w CJC: czasem gdy ja coś robię (np.
przełączam bufory) i jednocześnie coś przychodzi z sieci to się wiesza. Typowe
zakleszczenie (deadlock). Wiadomo, że gdzieś źle blokady wątków zastosowałem,
ale to się strasznie źle debuguje (dlatego IMHO wątków należy unikać jak
ognia). Kiedyś próbowałem, ale bardzo się nie postarałem i poległem. Potem po
prostu problem olewałem (pojawiał się tylko raz na jakiś czas, więc można było
z tym żyć). Wczoraj powiesiło się znowu i postanowiłem dzisiaj coś z tym
zrobić.

Najpierw więc dodałem do CJC obsługę pliku konfiguracyjnego dla modułu
logging ze biblioteki pythona (świetna rzecz!). Potem zapuściłem
na źródłach coś takiego:


find . -name "*.py" | xargs perl -pi -e \
's/^(\s+)([\w.]+\.(acquire|release)\(\))[ \t]*$/\1logging.getLogger("lockdebug").debug("\2..."); \2; logging.getLogger("lockdebug").debug("...\2")/'

Po tej operacji odpaliłem CJC, wszedłem na dwa czaty grupowe i zacząłem
przełączać bufory jak szalony. Po jakiejś minucie, czy dwóch zwiesił się
(Murphy poszedł na piwo?). No i chyba mam go! 🙂


2004-10-24 16:49:38,503 window.py: 167 th#16386 DEBUG self.screen.lock.acquire()...
2004-10-24 16:49:38,516 window.py: 167 th#16386 DEBUG ...self.screen.lock.acquire()
2004-10-24 16:49:38,524 text_buffer.py: 42 th#65540 DEBUG self.lock.acquire()...
2004-10-24 16:49:38,525 text_buffer.py: 42 th#65540 DEBUG ...self.lock.acquire()
2004-10-24 16:49:38,526 window.py: 252 th#65540 DEBUG self.screen.lock.acquire()...
2004-10-24 16:49:38,527 text_buffer.py: 208 th#16386 DEBUG self.lock.acquire()...

Teraz pozostaje to poprawić i liczyć na to, że to odosobniony przypadek
:-)

Reklamy

4 uwagi do wpisu “Mam go! :-)

  1. Marudzisz waść.
    Wątków należy używać wszędzie gdzie są użyteczne.
    Jeśli ich unikasz, to gdy musisz użyć – popełniasz błędy.
    Jeśli będą Twoją drugą naturą, to blokował będziesz odruchowo i na nosa czuł gdzie są sekcje krytyczne.

    Polubienie

  2. Błędy popełnia się zawsze (oczywiście mniej w dziedzinie którą się regularnie praktykuje), a lepiej mieć doczynienia z takimi, które łatwo znaleźć i naprawić.
    A problem nie był z brakiem blokowania, ale ze złą kolejnością blokowania. Właściwie to nawet z nadmiarem blokowania.

    Polubienie

  3. Dopóki pisałem tylko w Delphi, to wątki traktowałem jak wynalazek szatana, pewnie dlatego, że z powodu ich zintegrowania z mechanizmem wątków Windows nie rozumiałem zasady ich działania, a implementacja w Delphi nie nastraja optymistycznie. Gdy nauczyłem się Javy, to przy okazji zrozumiałem, jak to wszystko działa — tam to jest naprawdę prosto i przejrzyście zrobione. I przestałem bać się wątków.
    I nawet polubiłem GIL w Pythonie. 😉

    Polubienie

Co o tym sądzisz?

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s