To jest podsumowanie mojego tutoriala z PyCon 2020. Możesz znaleźć oryginalne wideo i kod źródłowy tutaj: https://github.com/santiagobasulto/pycon-concurrency-tutorial-2020
To jest szybki przewodnik/tutorial jak efektywnie pisać programy współbieżne przy użyciu Pythona. Współbieżność w Pythonie może być myląca. Istnieje wiele modułów (threading, _thread, multiprocessing, subprocess). Jest też znienawidzony GIL, ale tylko dla CPythona (PyPy i Jython nie mają GIL). Kolekcje nie są bezpieczne dla wątków, z wyjątkiem niektórych szczegółów implementacji w CPython.
Celem tego samouczka jest dostarczenie praktycznych zaleceń, jak podejść do każdego przypadku użycia kodu współbieżnego (lub równoległego).
Zauważysz, że w przeciwieństwie do niektórych innych bardziej tradycyjnych samouczków Pythona „tylko wielowątkowość”, zaczynam od podsumowania zarówno architektury komputera, jak i koncepcji systemów operacyjnych. Zrozumienie tych podstawowych pojęć jest fundamentalne dla poprawnego budowania programów współbieżnych. Proszę pominąć te sekcje, jeśli jesteś już zaznajomiony z tymi tematami.
Tutorial ten jest podzielony na następujące sekcje:
Współbieżność a równoległość
Architektura komputera
Rola systemu operacyjnego
Wątki w Pythonie
Synchronizacja wątków
Wieloprocesowość
Biblioteki wysokiego poziomu: concurrent.futures i parallel
Współbieżność vs Równoległość
Współbieżność jest wtedy, gdy kilka zadań działa w tym samym czasie. Jest to ostateczny cel programów współbieżnych. Współbieżność jest mniejsza niż równoległość, oznacza to, że uruchamiamy kilka zadań i żonglujemy nimi w tym samym przedziale czasowym. Jednak w danym momencie wykonujemy tylko jedno zadanie na raz.
Zastosowane do gotowania, byłyby to przykłady współbieżności i równoległości.
Współbieżność ma tylko jedną osobę w kuchni:
Zacznij kroić cebulę
Zacznij podgrzewać patelnię
Skończ kroić cebulę
W tym przypadku jest jasne, że nie możemy robić wielu rzeczy W TYM SAMYM CZASIE. Możemy zacząć je wszystkie, ale musimy odbijać się tam i z powrotem, aby je kontrolować.
Paralelizm ma wiele osób w kuchni:
Osoba 1 kroi cebulę
Osoba 2 kroi czerwoną paprykę
Osoba 3 czeka aż patelnia się rozgrzeje
W tym przypadku jest kilka zadań wykonywanych w tym samym czasie.
Architektura komputerów
Wszystkie współczesne komputery można uprościć stosując architekturę von Neumanna, która ma 3 główne składniki: Obliczenia (CPU), Pamięć (RAM), I/O (dyski twarde, sieci, wyjście wideo).
Twój kod zawsze będzie wykonywał zadania związane z każdym z tych komponentów. Niektóre instrukcje są „obliczeniowe” ( x + 1), niektóre są pamięciowe (x = 1), a niektóre są I/O (fp = open('data.csv')).
Aby właściwie zrozumieć szczegóły współbieżności w Pythonie, ważne jest, aby pamiętać o różnych „czasach dostępu” tych komponentów. Dostęp do procesora jest o wiele szybszy niż dostęp do pamięci RAM, nie mówiąc już o I/O. Istnieje badanie porównujące opóźnienie komputera do względnych czasów człowieka: jeśli cykl procesora reprezentuje 1 sekundę ludzkiego czasu, żądanie sieciowe z San Francisco do Hong Kongu zajmuje 11 lat.