2008-12-28 39 views
6

Ogólny samouczek lub dobre źródło informacji na temat używania wątków w języku Python?Wątki w języku Python

Kiedy używać wątków, w jaki sposób są skuteczne, a niektóre ogólne na temat wątków [specyficznych dla Pythona]?

Odpowiedz

13

Wątki powinny być używane, gdy chcesz jednocześnie uruchomić dwie rzeczy lub chcesz, aby coś działało w tle bez spowalniania głównego procesu.
Moja rekomendacja to używać tylko wątków, jeśli musisz. Z reguły zwiększają złożoność programu.
głównej dokumentacji do gwintowania jest tutaj: http://docs.python.org/library/threading.html
Przykładami są tu:
http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/
http://linuxgazette.net/107/pai.html
http://www.wellho.net/solutions/python-python-threads-a-first-example.html

3

Istnieje fantastyczny plik pdf, Tutorial on Threads Programming with Python autorstwa Normana Matloffa i Francisa Hsu z University of California, Davis.

W miarę możliwości należy unikać wątków. Przyczyniają się do złożoności, problemów z synchronizacją i trudnych do rozwiązania problemów. Jednak wymagają tego niektóre problemy (np. Programowanie GUI), ale zachęcam cię do szukania rozwiązania z jednym gwintem, jeśli możesz.

+3

Przykro nam, wątki nie powinny być "unikane w miarę możliwości", ani nie są "wymagane" do programowania GUI. –

+0

Może to prawda, ale czy możesz podać lepsze powody/przykłady? –

+0

Dzięki za link! –

8

Jedna rzecz do zapamiętania, zanim poświęcisz czas i wysiłek na pisanie wielowątkowej aplikacji Pythona, to jest Global Interpreter Lock (GIL), więc w rzeczywistości nie będziesz więcej niż jeden wątek na raz.

Powoduje to, że wątki nie nadają się do próby skorzystania z wielu rdzeni lub procesorów. Możesz uzyskać przyspieszenie z multipleksowania innych zasobów (sieci, dysku, ...), ale nigdy nie było to szczególnie zauważalne na moim doświadczeniu.

Generalnie używam wątków tylko wtedy, gdy jednocześnie odbywa się kilka logicznie oddzielnych zadań, a mimo to chcę je wszystkie w tej samej maszynie wirtualnej. Wątek pobierający dane z sieci i umieszczający go w kolejce, podczas gdy inny wątek wyskakuje z kolejki i zapisuje w bazie danych, coś w tym rodzaju.

Z Pythonem 2.6 jest nowy moduł multiprocessing, który jest całkiem fajny - ma bardzo podobny interfejs do modułu threading, ale w rzeczywistości tworzy nowe procesy systemu operacyjnego, omijając GIL.