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
:-)
Śledzenie komentarzy (RSS)
Jesteście obserwowani...
24 października 2004 17:14:35
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.