Blokada pozwala wymusić dostęp do wielu wątków zasób jeden na raz, a nie wszystkie próbują jednocześnie uzyskać dostęp do zasobu.
Jak sam zauważysz, zwykle chcesz, aby wątki były wykonywane jednocześnie. Jednak wyobraź sobie, że masz dwa wątki i oboje zapisują do tego samego pliku. Jeśli spróbują napisać do tego samego pliku w tym samym czasie, ich wynik zostanie zamieniony i żaden wątek nie będzie w stanie umieścić w pliku tego, co chciał.
Być może ten problem nie pojawi się cały czas. W większości przypadków wątki nie będą próbowały pisać do pliku naraz. Ale czasami, może raz na tysiąc biegaczy, robią to. Więc może masz błąd, który zdaje się być przypadkowy i trudny do odtworzenia, a przez to trudny do naprawienia. Ugh!
A może ... i stało się to w firmie, w której pracuję ... masz takie błędy, ale nie wiesz, że tam są, ponieważ prawie żaden z twoich klientów nie ma więcej niż 4 procesorów. Wtedy wszyscy zaczynają kupować pudełka 16-procesorowe ... a twoje oprogramowanie działa tak samo jak wiele wątków, ponieważ są rdzenie procesora, więc teraz jest 4 razy więcej wątków i nagle często się załamujesz lub otrzymujesz złe wyniki.
Tak czy inaczej, z powrotem do pliku. Aby zapobiec nawarstwianiu się wątków, każdy wątek musi uzyskać blokadę pliku przed zapisaniem. Tylko jeden wątek może przechowywać blokadę naraz, więc tylko jeden wątek może zapisywać do pliku naraz. Wątek utrzymuje blokadę, dopóki nie zostanie zapisany w pliku, a następnie zwalnia blokadę, aby inny wątek mógł użyć tego pliku.
Jeśli wątki są zapisywane do różnych plików, ten problem nigdy nie powstaje. To jedno rozwiązanie: poproś swoje wątki o zapisanie do różnych plików i połącz je później, jeśli to konieczne. Ale nie zawsze jest to możliwe; czasami jest tylko jeden z czegoś.
To nie muszą być pliki. Załóżmy, że próbujesz po prostu policzyć liczbę wystąpień litery "A" w grupie różnych plików, po jednym wątku na plik. Myślisz, cóż, oczywiście, po prostu wszystkie wątki zwiększą tę samą lokalizację pamięci za każdym razem, gdy zobaczą "A." Ale! Gdy zwiększysz zmienną, która utrzymuje liczbę, komputer odczytuje zmienną do rejestru, zwiększa rejestr, a następnie zapisuje wartość z powrotem. Co się stanie, jeśli dwa wątki odczytują wartość w tym samym czasie, zwiększają ją jednocześnie i zapisują w tym samym czasie? Zaczynają od, powiedzmy, 10, zwiększ ją do 11, zapisz 11 z powrotem. Tak więc licznik powinien mieć 11, kiedy powinno być 12: straciłeś jedną liczbę.
Zdobywanie zamków może być kosztowne, ponieważ trzeba czekać, aż ktoś inny użyje zasobu. Właśnie dlatego globalna blokada interpretera Pythona jest wąskim gardłem wydajności.Dlatego możesz w ogóle unikać korzystania z udostępnionych zasobów. Zamiast używać pojedynczego miejsca w pamięci do przechowywania liczby "A" w twoich plikach, każdy wątek zachowuje swoją własną liczbę i dodajesz je wszystkie na końcu (podobnie do rozwiązania, które zasugerowałem z plikami, wystarczająco zabawnie) .
Nie Nie pytam o GIL, znam ograniczenia w python i jestem z niego zadowolony, pytanie dotyczy blokowania wątków z nabywać() i release() niezwiązanych z GIL (inne niż to ma blokadę w nazwie) – MistahX
Retagged, jako nie wyłączny dla 'pythona' w ogóle. –
retagged jako python, mam na myśli metody blokowania w module wątków, zapomniałem dodać, że w – MistahX